2015-01-01 64 views
0

我正在做推力transform_reduce,需要從函子內部訪問thrust :: device_vector。我不是迭代device_vector。它允許我聲明函子,傳入device_vector引用,但不會讓我對它進行引用,無論是使用begin()還是operator []。如何從推力函數中取消引用thrust :: device_vector?

1> C:\ Program Files \ NVIDIA GPU計算工具包\ CUDA \ v6.5 \ include \ thrust/detail/function.h(187):警告:調用主機函數(「thrust :: detail :: vector_base> ::操作符[] 「從主機設備功能)(」 推力::詳細:: host_device_function ::運算符()「)是不允許

我假設我就可以傳入基指針並自己執行指針數學,但有沒有原因不支持?

+1

你需要的'your_vector.data結果通過() '。 CUDA'__device__'函數通常不能取消引用宿主指針,所以嘗試給functor提供'your_vector'的引用是沒有意義的。 –

回答

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 
$ 
相關問題