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

Cuda 从设备内核访问cusp变量元素,cuda,cusp-library,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_mall

我无法从设备/全局内核访问和分配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
alay.cu(8):警告:不能在设备函数中直接获取主机变量“p1”的地址
alay.cu(8):错误:不允许从uuu全局函数(“func”)调用uu主机函数(“推力::细节::向量u基::运算符[]”)
代码如下

#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;
}
#包括
尖点:阵列1dP1(10,3);
__全局函数
{
p1[blockIdx.x]=p1[blockIdx.x]+blockIdx.x*5;
}
int main()
{
func();
返回0;
}
尖点矩阵和阵列(以及它们所用的推力容器)仅供主机使用。您不能在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::array1d p1(10);

对于(int i=0;iyes,我想通过设备线程操作设备array1d,你能详细说明一下吗,或者给出示例代码,因为我仍然不明白?只是一个疑问,你的意思是
cusp::array1d p2(10)=p1;
成为
cusp::array1d p2(10)=p1;
是吗?不是,我已经编辑了问题和代码,以使我的问题更容易理解。请看一下“原始”示例@SagarMasuti:是的,那只是一个复制粘贴错误。我已经编辑了答案
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