【问题标题】:Accessing cusp variable element from device kernel从设备内核访问尖点变量元素
【发布时间】:2013-11-27 19:50:32
【问题描述】:

我在从设备/全局内核访问和分配 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;
}

【问题讨论】:

    标签: cuda cusp-library


    【解决方案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
    

    【讨论】:

    • 是的,我想通过设备线程操作设备array1d,由于我还是不明白,您能否详细说明或提供示例代码?
    • 只是怀疑,你的意思是cusp::array1d&lt;float, cusp::host_memory&gt; p2(10) = p1;cusp::array1d&lt;float, cusp::device_memory&gt; p2(10) = p1; 是吗?
    • 不,我已经编辑了问题和代码以使我的问题更容易理解
    • 看看“原始”示例here
    • @SagarMasuti:是的,这只是一个复制粘贴错误。我已经编辑了答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-15
    • 2012-05-08
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 2015-09-22
    • 2019-12-27
    相关资源
    最近更新 更多