将设备内存中的值作为CUDA中的内核参数传递

将设备内存中的值作为CUDA中的内核参数传递,cuda,Cuda,我正在编写一个CUDA应用程序,它有一个步骤,计算一些复杂值输入数据的方差,然后使用该方差设置数据阈值。我有一个还原内核,它为我计算方差,但我不确定是否必须将值拉回到主机以将其传递给阈值内核 有没有直接从设备内存传递值的方法?您可以使用\uuuu device\uuu变量来保存内核调用之间的差异值 将其放在使用它的内核的定义之前: __device__ float my_variance = 0.0f; 可由设备上执行的任何内核使用(无需将其作为内核函数参数显式传递),并在上下文的生存期内(即

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


有没有直接从设备内存传递值的方法?

您可以使用
\uuuu device\uuu
变量来保存内核调用之间的差异值

将其放在使用它的内核的定义之前:

__device__ float my_variance = 0.0f;
可由设备上执行的任何内核使用(无需将其作为内核函数参数显式传递),并在上下文的生存期内(即任何单个内核调用的生存期之外)保持

您的问题并不完全清楚,但您也可以通过这种方式定义数据数组

__device__ float my_variance[32] = {0.0f};
同样,由
cudamaloc
创建的分配在应用程序/上下文期间有效(或直到遇到适当的
cudaFree
),因此,如果要在后续内核中使用数据,则无需将其“拉回”到主机:

float *d_variance;
cudaMalloc((void **)&d_variance), sizeof(float));
my_reduction_kernel<<<...>>>(..., d_variance, ...);
my_thresholding_kernel<<<...>>>(..., d_variance, ...);
float*d_方差;
Cudamaloc((无效**)和d_方差),sizeof(浮动);
我的约化核(…,d_方差,…);
我的阈值核(…,d_方差,…);

阈值内核将正确地观察上面的缩减内核在
*d_variance
中设置的任何值。

您可以使用
\uu设备\uu
变量在内核调用之间保持方差值

将其放在使用它的内核的定义之前:

__device__ float my_variance = 0.0f;
可由设备上执行的任何内核使用(无需将其作为内核函数参数显式传递),并在上下文的生存期内(即任何单个内核调用的生存期之外)保持

您的问题并不完全清楚,但您也可以通过这种方式定义数据数组

__device__ float my_variance[32] = {0.0f};
同样,由
cudamaloc
创建的分配在应用程序/上下文期间有效(或直到遇到适当的
cudaFree
),因此,如果要在后续内核中使用数据,则无需将其“拉回”到主机:

float *d_variance;
cudaMalloc((void **)&d_variance), sizeof(float));
my_reduction_kernel<<<...>>>(..., d_variance, ...);
my_thresholding_kernel<<<...>>>(..., d_variance, ...);
float*d_方差;
Cudamaloc((无效**)和d_方差),sizeof(浮动);
我的约化核(…,d_方差,…);
我的阈值核(…,d_方差,…);

通过上述缩减内核在
*d_variance
中设置的任何值都将被阈值内核正确观察。

这似乎满足了我的要求。我知道Cudamaloc可以做到,但我不想为单个值传递指针。通过将其按值传递给内核,我相信它会自动放入共享内存中初始化后,对吗?是的,可以。假设您没有将其标记为
const
。我正在将
\uuuu设备\uuuu
var重置为零(
var=0;
),然后在内核函数中进行一些计算,为什么重置没有生效?您不能执行
var=0。您必须在设备代码中为
\uuu设备\uuu
变量执行此操作。或者,您必须使用
cudaMemcpyToSymbol
操作将var设置为零。这似乎符合我的要求。我知道Cudamaloc可以做到,但我不想为单个值传递指针。通过将其按值传递给内核,我相信它会自动放入共享内存中初始化后,对吗?是的,可以。假设您没有将其标记为
const
。我正在将
\uuuu设备\uuuu
var重置为零(
var=0;
),然后在内核函数中进行一些计算,为什么重置没有生效?您不能执行
var=0。您必须在设备代码中为
\uuu设备\uuu
变量执行此操作。否则,您必须使用
cudaMemcpyToSymbol
操作将var设置为零。