我正在编写一个CUDA应用程序,该应用程序具有计算某些复值输入数据的方差的步骤,然后该方差用于对数据进行阈值处理。我有一个减少内核来计算我的方差,但是我不确定是否必须将值拉回主机以将其传递给阈值内核。
有没有办法直接从设备内存传递值?
答案 0 :(得分:4)
您可以使用__device__
变量来保存内核调用之间的差异值。
在使用它的内核定义之前加上它:
__device__ float my_variance = 0.0f;
设备上执行的任何内核都可以使用Variables defined this way(不要求它们作为内核函数参数显式传递)并持续上下文的生命周期,即超出任何单个内核调用的生命周期
您的问题并不完全清楚,但您也可以通过这种方式定义数据数组。
__device__ float my_variance[32] = {0.0f};
同样,cudaMalloc
创建的分配在应用程序/上下文的持续时间内(或直到遇到适当的cudaFree
)存在,因此不需要“撤回数据”到如果要在连续的内核中使用它,请使用host:
float *d_variance;
cudaMalloc((void **)&d_variance), sizeof(float));
my_reduction_kernel<<<...>>>(..., d_variance, ...);
my_thresholding_kernel<<<...>>>(..., d_variance, ...);
阈值内核将正确观察上面的简化内核在*d_variance
中设置的任何值。