设备内存刷新 CUDA

3

我正在运行一个C程序,在其中调用了两次cuda主机函数。我想在这两个调用之间清理设备内存。有没有一种方法可以刷新GPU设备内存??我使用的是计算能力为2.0的Tesla M2050。


你能否更明确地解释一下你所说的“flush”或“clean up”是什么意思?你是想将内存清零,还是设置为其他已知的未初始化值,或者你是指其他的操作?而且,你是只想“flush”你已经分配的内存,还是整个设备都要清理? - talonmies
我想将我分配的内存清零,以“忘记”各个内核存储在其中的值。对于问题的含糊不清,我感到抱歉。 - chemeng
2个回答

5

如果您只想将内存清零,那么cudaMemset可能是最简单的方法。例如:

const int n = 10000000;
const int sz = sizeof(float) * n;
float *devicemem;
cudaMalloc((void **)&devicemem, sz);

kernel<<<...>>>(devicemem,....);
cudaMemset(devicemem, 0, sz); // zeros all the bytes in devicemem
kernel<<<...>>>(devicemem,....);

请注意,cudaMemset函数的参数是一个字节值,指定范围内的所有字节都将设置为该值,类似于标准C库中的memset函数。如果您有特定的单词值,则需要编写自己的memset内核以分配值。

1
要对16位和32位的值进行memset操作,您可以调用驱动程序API的cuMemset*函数族,例如cuMemsetD16()或cuMemsetD32(),甚至可以在CUDA运行时应用程序中使用。 - ArchaeaSoftware
@talonmies:感谢您在SO上提供的所有CUDA答案帮助。您能直接联系我吗(我的公司邮箱:名字首字母+姓氏@我的公司域名.com)?我有一个问题想问您(很抱歉,SO不支持私信)。 - harrism

1
如果您正在使用Thrust向量,则可以在要重置的向量上调用thrust::fill(),并使用所需的重置值。
thrust::device_vector< FooType > fooVec( FooSize );
kernelCall1<<< x, y >>>( /* Pass fooVec here */ );

// Reset memory of fooVec
thrust::fill( fooVec.begin(), fooVec.end(), FooDefaultValue );

kernelCall2<<< x, y >>>( /* Pass fooVec here */ );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接