如何从推力函子中取消对推力::设备向量的引用?

All*_*age 0 cuda thrust

我正在做一个推力 transform_reduce 并且需要从函子内部访问一个推力::设备向量。我不是在 device_vector 上迭代。它允许我声明函子,传入 device_vector 引用,但不允许我使用 begin() 或 operator[] 取消引用它。

1>C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\include\thrust/detail/function.h(187): 警告:调用宿主函数("thrust::detail::vector_base > :: operator []") 来自主机 设备函数("thrust::detail::host_device_function ::operator () ") 是不允许的

我假设我将能够传入基指针并自己进行指针数学运算,但是是否有不支持的原因?

Rob*_*lla 5

只是扩展@JaredHoberock 已经指出的内容。我想他不会介意的。

可用于推力的函子必须(在大多数情况下)符合强加于任何 CUDA 设备代码的要求。

二者thrust::host_vectorthrust::device_vector分别用来操纵主数据和设备数据主机代码容器。无法在设备代码中成功使用对主机代码容器的引用。这意味着即使您成功传递了对容器的引用,您也无法.push_back()在设备代码中使用它(例如,不能执行)。

对于设备代码(例如函子或内核)中的直接操作,您必须从推力中提取原始设备指针并使用您自己的指针算法直接使用这些指针。并且高级功能(例如.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
$
Run Code Online (Sandbox Code Playgroud)