2013-11-27 25 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