0

我正在编写一个 CUDA 应用程序,它有一个步骤,计算一些复值输入数据的方差,然后使用该方差对数据进行阈值处理。我有一个为我计算方差的归约内核,但我不确定是否必须将值拉回主机以将其传递给阈值内核。

有没有办法直接从设备内存中传递值?

4

1 回答 1

4

您可以使用__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都将被阈值内核正确观察。

于 2013-10-04T15:55:17.763 回答