如何从推力仿函数中取消引用thrust :: device_vector?

时间:2015-01-01 18:56:31

标签: cuda thrust

我正在做一个推力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):警告:调用主机功能(& #34; thrust :: detail :: vector_base> :: operator []")来自主机 设备功能(" thrust :: detail :: host_device_function :: operator()")是不允许的

我假设我能够传入基指针并自己做指针数学,但是有没有理由不支持这个?

1 个答案:

答案 0 :(得分:4)

只是扩展了@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
$