为什么设备代码可以像这样访问cuda中的主机变量
Why did device code can access host variable in cuda like this?
在下面的代码中,我使用了推力库,我不理解的是在设备
代码,我可以访问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);
^
主机代码中存在 在运行时处理,而不是在编译时处理。您可以将 我就是这么解释的。也许talonmies或JaredHoberock(或其他人)可以纠正我的术语,但我认为要点是正确的。1
参数。然而,device_vector
的推力构造函数启动必要的主机->设备内存副本(和/或内核调用,取决于特定的推力函数)来初始化device_vector
存储,该存储存在于设备上。4
常量替换为变量,并且仍然可以得到有效的结果,就像您可以将device_vector
的1初始化器替换为变量一样。
相关文章:
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- 如何在 cuda 中将 kd 树从主机复制到驱动程序
- 分离库的主机端和 CUDA 设备端版本
- 为什么以下 POP 功能无法在主机或设备 (CUDA) 上运行?
- 如何在 cuda 中将结构的指针变量从主机复制到设备
- CUDA 主机 - 设备同步
- CUDA 设备主机复制非常慢
- 为什么不能重载CUDA C++类的主机/设备成员函数
- 如何在Cuda中将2D阵列从设备复制到主机
- 如何将变量从主机上的自定义类数组复制到 CUDA 中设备上的浮点数组中
- 在 CUDA 设备代码和主机代码中创建模板类对象时未解析的外部函数
- CUDA中设备函数指针的分配(来自主机函数指针)
- CUDA:查明主机缓冲区是否被固定(页面锁定)
- 主机循环的CUDA布尔变量
- 我什么时候应该首选写入组合 CUDA 分配的映射主机内存
- 我可以在 CUDA 中同时对设备和主机类使用矢量吗?
- 在每个主机线程(多线程 CPU)上创建一个 cuda 流
- 如何从 cuda 中的设备函数调用现有主机函数
- 两个单精度浮点向量的点积在 CUDA 内核中产生的结果与在主机上的结果不同
- 如何从主机代码中断或取消 CUDA 内核