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

Why did device code can access host variable in cuda like this?

本文关键字:cuda 主机 变量 访问 像这样 代码 为什么      更新时间:2023-10-16

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

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

4在构造函数中

struct op{
    float v;
    op(float iv):v(iv){}
    __device__
    void operator()(float v2)
    {
         printf("%fn", 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"

v不在主机内存中,至少在设备代码中实例化functor对象时不存在。(你的结构,其()操作符只有__device__装饰,将只"工作"在设备代码。)

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

复制op()初始化参数(在您的例子中是4)与这里的1参数没有什么不同:

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

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

在运行时处理,而不是在编译时处理。您可以将4常量替换为变量,并且仍然可以得到有效的结果,就像您可以将device_vector的1初始化器替换为变量一样。

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