【问题标题】:thrust::device_vector in CUDA [duplicate]CUDA 中的推力::device_vector [重复]
【发布时间】:2013-01-04 18:21:53
【问题描述】:

我是 CUDA 的新手,正在尝试学习用法。有人可以帮忙吗?我在主要功能中有以下内容(我在 Visual Studio 中,我的源文件和头文件分别是 .cu 和 .cuh)

 thrust::device_vector<float> d_vec(100);
 kernel<<<100,1>>>(d_vec);

然后在内核中我有

    template <typename T> __global__ kernel(thrust::device_vector<T> d_vec)
    {  int tid = threadIdx.x + blockIdx.x*blockDim.x;
       T xxx = 3.0;
       d_vec[tid] = xxx;
     }

我的目标是用 float 调用内核一次,用 double 调用一次。另请注意,在这个简单的示例中,我有变量 xxx(在我的实际情况中,它是一些产生双精度或浮点数的计算)。

我得到两个错误: 1> 不允许从__global__ 函数调用__host__ 函数(运算符=) 2> 不允许从__global__ 函数调用__host__ 函数(运算符[])

所以我猜“d_vec[tid] = ..”中的“[]”和“=”是问题所在。但我的问题是如何访问内核中的设备向量。有人可以澄清什么是正确的程序以及我做错了什么。提前致谢

【问题讨论】:

  • 我也意识到我很可能在做一些不好的事情。说我的向量很大说 60000 个元素。理想情况下,我想生成 60000 个内核并将每个内核计算的结果复制到向量的适当索引中。但我不想生成 60000 个长度为 60000 的向量(希望这不是我的代码中发生的情况。)

标签: c++ visual-studio-2010 cuda


【解决方案1】:

thrust::device_vector 对象/引用不能用作内核参数。 您可以使用原始指针来传递设备矢量数据。

thrust::device_vector<float> d_vec(100);
float* pd_vec = thrust::raw_pointer_cast(d_vec.data());
kernel<<<100,1>>>(pd_vec);

这是内核的原型

template <typename T> __global__ kernel(T* pd_vec)

You Q 与此类似。 how to cast thrust::device_vector<int> to raw pointer

【讨论】:

    猜你喜欢
    • 2015-05-11
    • 1970-01-01
    • 2020-10-18
    • 2018-11-25
    • 2013-06-08
    • 2014-07-01
    • 2011-12-24
    • 2019-03-18
    相关资源
    最近更新 更多