如何从推力函子中取消引用 thrust::device_vector?
How can I dereference a thrust::device_vector from within a thrust functor?
我正在执行 transform_reduce 并且需要从仿函数中访问 thrust::device_vector。我没有重复 device_vector。它允许我声明仿函数,传入 device_vector 引用,但不允许我使用 begin() 或 operator[].
取消引用它
1>C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\include\thrust/detail/function.h(187): 警告:调用 来自 host device function("thrust::detail::host_device_function ::operator () ") 的 host function("thrust::detail::vector_base > ::operator []") 是不允许的
我想我将能够传入基指针并自己进行指针数学运算,但是是否有不支持的原因?
只是扩展@JaredHoberock 已经指出的内容。我想他不会介意的。
thrust 可用的函子必须(在大多数情况下)符合对任何 CUDA 设备代码施加的要求。
thrust::host_vector
和thrust::device_vector
都是主机代码容器,分别用来操作主机数据和设备数据。无法在设备代码中成功使用对主机代码容器的引用。这意味着即使您成功传递了对容器的引用,您也无法在设备代码中使用它(例如,无法执行 .push_back()
)。
对于设备代码(例如仿函数或内核)中的直接操作,您必须从 thrust 中提取原始设备指针并使用您自己的指针算法直接使用它们。并且高级功能(例如.push_back()
)将不可用。
提取推力数据对应的原始设备指针有多种方式,下面的示例代码演示了两种可能:
$ cat t651.cu
#include <thrust/device_vector.h>
#include <thrust/sequence.h>
__global__ void printkernel(float *data){
printf("data = %f\n", *data);
}
int main(){
thrust::device_vector<float> mydata(5);
thrust::sequence(mydata.begin(), mydata.end());
printkernel<<<1,1>>>(mydata.data().get());
printkernel<<<1,1>>>(thrust::raw_pointer_cast(&mydata[2]));
cudaDeviceSynchronize();
return 0;
}
$ nvcc -o t651 t651.cu
$ ./t651
data = 0.000000
data = 2.000000
$
我正在执行 transform_reduce 并且需要从仿函数中访问 thrust::device_vector。我没有重复 device_vector。它允许我声明仿函数,传入 device_vector 引用,但不允许我使用 begin() 或 operator[].
取消引用它1>C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\include\thrust/detail/function.h(187): 警告:调用 来自 host device function("thrust::detail::host_device_function ::operator () ") 的 host function("thrust::detail::vector_base > ::operator []") 是不允许的
我想我将能够传入基指针并自己进行指针数学运算,但是是否有不支持的原因?
只是扩展@JaredHoberock 已经指出的内容。我想他不会介意的。
thrust 可用的函子必须(在大多数情况下)符合对任何 CUDA 设备代码施加的要求。
thrust::host_vector
和thrust::device_vector
都是主机代码容器,分别用来操作主机数据和设备数据。无法在设备代码中成功使用对主机代码容器的引用。这意味着即使您成功传递了对容器的引用,您也无法在设备代码中使用它(例如,无法执行 .push_back()
)。
对于设备代码(例如仿函数或内核)中的直接操作,您必须从 thrust 中提取原始设备指针并使用您自己的指针算法直接使用它们。并且高级功能(例如.push_back()
)将不可用。
提取推力数据对应的原始设备指针有多种方式,下面的示例代码演示了两种可能:
$ cat t651.cu
#include <thrust/device_vector.h>
#include <thrust/sequence.h>
__global__ void printkernel(float *data){
printf("data = %f\n", *data);
}
int main(){
thrust::device_vector<float> mydata(5);
thrust::sequence(mydata.begin(), mydata.end());
printkernel<<<1,1>>>(mydata.data().get());
printkernel<<<1,1>>>(thrust::raw_pointer_cast(&mydata[2]));
cudaDeviceSynchronize();
return 0;
}
$ nvcc -o t651 t651.cu
$ ./t651
data = 0.000000
data = 2.000000
$