首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从设备内核访问cusp变量元素

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

Stack Overflow用户
提问于 2013-11-27 14:21:23
回答 1查看 461关注 0票数 0

我在从设备/全局内核访问和分配带有cusp array1d类型的变量时遇到问题。附加的代码给出错误

代码语言:javascript
复制
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

下面的代码

代码语言:javascript
复制
#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;
}
EN

回答 1

Stack Overflow用户

发布于 2013-11-27 14:43:28

尖点矩阵和数组(以及构建它们的推力容器)仅供主机使用。您不能在GPU代码中直接使用它们。

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

代码语言:javascript
复制
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注释。

您的编辑仍然不会显示任何在没有内核的情况下无法在主机上完成的内容,即:

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20235322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档