为什么设备代码可以像这样访问cuda中的主机变量?

时间:2014-06-05 04:06:06

标签: c++ cuda

在下面的代码中,我使用了推力库,我不明白的是设备

代码我可以访问v,我认为它在主机内存中,因为我直接给它赋值

4在构造函数中。

struct op{
    float v;
    op(float iv):v(iv){}
    __device__
    void operator()(float v2)
    {
         printf("%f\n", v+v2);
    }
};
int main()
{
    device_vector<float> data(4,1);
    for_each(data.begin(), data.end(), op(4));
    return 0;
}

上面代码的输出是5.0 5.0 5.0 5.0

那么,你能给出一些关于这种行为的提示吗?我通过官方搜索了

手动,但未获得有关此行为的任何信息。


对不起我的快递,就像Ben Voigt说的,我的问题是“what I don't understand is in the device code I can access v, which I think is in host memory

1 个答案:

答案 0 :(得分:2)

v不在主机内存中,至少如果在设备代码中实例化了functor对象则不行。 (而且您的()运算符仅具有__device__修饰符的结构只会在设备代码中运行&#34;。

iv从主机内存开始,但是从iv(主机)复制到v的过程(设备,至少在使用op对象的情况下推力装置操作)在计算for_each函数之前由推力处理。

复制op()初始化参数(在您的情况下为4)与此处1参数需要发生的情况没有什么不同:

device_vector<float> data(4,1);
                            ^

主机代码中存在1参数。然而device_vector的推力构造函数启动必要的主机 - >设备内存副本(和/或内核调用,具体取决于具体的推力函数)来初始化存储 on的device_vector存储设备

这是在运行时处理的,而不是在编译时处理的。您可以使用变量替换4常量,并且仍然可以获得有效结果,就像您可以使用变量替换{1}}的1初始值设定项一样。

这就是我解释它的方式。可能是talonmies或JaredHoberock(或其他人)可以纠正我的术语,但我认为要点是正确的。