2013-01-21 121 views
0

我是CUDA的新手,正在嘗試學習使用方法。有人可以請幫忙。我已在主要功能如下(我在Visual Studio和我的源文件和頭文件是.CU分別.cuh)CUDA中的thrust :: device_vector

thrust::device_vector<float> d_vec(100); 
kernel<<<100,1>>>(d_vec); 

,然後在內核中,我有

template <typename T> __global__ kernel(thrust::device_vector<T> d_vec) 
    { int tid = threadIdx.x + blockIdx.x*blockDim.x; 
     T xxx = 3.0; 
     d_vec[tid] = xxx; 
    } 

我目標是用float和kernel調用一次內核。還要注意,在這個簡單的例子中,我有變量xxx(在我的實際情況下是一些產生雙精度或浮點數的計算)。

和我得到兩個誤差: 1>從__global__函數調用__host__函數(操作符=)不允許 2>從__global__函數調用__host__函數(操作符[])是不允許的

所以我想「d_vec [tid] = ..」中的「[]」和「=」是問題。但我的問題是我如何訪問我的內核中的設備向量。有人可以澄清什麼是正確的程序,我做錯了什麼。在此先感謝

+0

我也意識到,最有可能我做的事情不好。說我的矢量非常大說60000元。理想情況下,我想生成60000內核並將每個內核計算的結果複製到該向量的相應索引。但我不想產生每個長度爲60000的60000個向量(希望這不是我的代碼中發生的事情)。 – user1612986

回答

3

thrust :: device_vector對象/引用不能用作內核參數。 您可以使用原始指針傳遞設備矢量數據。

thrust::device_vector<float> d_vec(100); 
float* pd_vec = thrust::raw_pointer_cast(d_vec.data()); 
kernel<<<100,1>>>(pd_vec); 

和這裏的內核的原型

template <typename T> __global__ kernel(T* pd_vec) 

你Q是與此類似。 how to cast thrust::device_vector<int> to raw pointer

相關問題