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