从设备内核访问cusp变量元素

时间:2013-11-27 06:21:23

标签: cuda cusp-library

我有一个问题是从设备/全局内核访问和分配cusp array1d类型的变量。附加的代码给出了错误

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 个答案:

答案 0 :(得分:1)

CUSP矩阵和数组(以及它们构建的Thrust容器)仅供主机使用。您无法在GPU代码中直接使用它们。

填充CUSP稀疏矩阵的规范方法是在 host 内存中构建它并使用复制构造函数将其复制到设备内存中,因此您的简单示例将变为:

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