在下面的代码中,我使用了推力库,我不明白的是设备
代码我可以访问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
”
答案 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(或其他人)可以纠正我的术语,但我认为要点是正确的。