如何从推力函子中取消引用 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_vectorthrust::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
$