2013-11-27 23 views
0

我有一個問題,從設備/全局內核訪問和分配變量與cusp array1d類型。附帶的代碼給出錯誤從設備內核訪問cusp變量元素

alay.cu(8): warning: address of a host variable "p1" cannot be directly taken in a device function 

alay.cu(8): error: calling a __host__ function("thrust::detail::vector_base<float, thrust::device_malloc_allocator<float> > ::operator []") from a __global__ function("func") is not allowed 

代碼下面

#include <cusp/blas.h> 
cusp::array1d<float, cusp::device_memory> p1(10,3); 
__global__ void func() 
{ 
p1[blockIdx.x]=p1[blockIdx.x]+blockIdx.x*5; 
} 
int main() 
{ 
func<<<10,1>>>(); 
return 0; 
} 

回答

1

CUSP矩陣和陣列(並且它們具有內置的推力容器)僅用於主機使用。你不能直接在GPU代碼中使用它們。

的規範的方法來填充風口浪尖稀疏矩陣將構建它主機記憶和使用拷貝構造函數複製它跨越到設備內存,所以你簡單的例子變成這樣:

cusp::array1d<float, cusp::host_memory> p1(10); 
for(int i=0; i<10; i++) p1[i] = 4.f; 
cusp::array1d<float, cusp::device_memory> p2(10) = p1; // data now on device 

如果您想在設備代碼中操作稀疏矩陣,則需要針對您感興趣的任何格式設置內核,並將指向每個設備陣列的指針傳遞給該內核,並將矩陣數據作爲參數傳遞給每個設備陣列。對於CUSP發行版中包含的所有稀疏類型,都有很好的Doxygen源註釋。


你的編輯仍然不存在任何可能不是在主機上完成,無需內核,即:

cusp::array1d<float, cusp::host_memory> p1(10, 3.f); 
for(int i=0; i<10; i++) p1[i] += (i * 5.f); 
cusp::array1d<float, cusp::device_memory> p2(10) = p1; // data now on device 
+0

是的,我想通過設備線程操縱裝置array1d,你能不能詳細說明或給出示例代碼,因爲我仍然不明白? – user3040447

+1

只是一個疑問,你的意思是'cusp :: array1d p2(10)= p1;'是cusp :: array1d p2(10)= p1; 「是嗎? –

+0

不,我編輯了這個問題和代碼,使我的問題更易於理解 – user3040447