2012-03-01 91 views
3

我正在运行一个C程序,在那里我调用两次cuda主机函数。我想清除这两个调用之间的设备内存。有没有一种方法可以刷新GPU设备内存?我在计算能力为2.0的特斯拉M2050上设备内存刷新cuda

+0

您是否更精确地指出“冲洗”或“清理”的含义?你的意思是你想将记忆归零,还是将它设置为其他已知的非初始化值,或者你的意思是别的吗?你是想“冲洗”你已分配的记忆,还是你的意思是整个设备? – talonmies 2012-03-01 14:55:43

+0

我想将我分配的内存归零,以便“忘记”各种内核存储在那里的值。对于问题的含糊不清,请稍等。 – chemeng 2012-03-01 15:03:28

回答

4

如果您只想将内存归零,那么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

要memset 16位和32位值,您可以调用驱动程序API的cuMemset *函数系列,例如cuMemsetD16()或cuMemsetD32(),即使是来自CUDA运行时应用程序。 – ArchaeaSoftware 2012-03-02 12:57:29

+0

@talonmies:感谢您对SO的所有CUDA答案的帮助。你能直接与我联系吗(我的公司Dot Com的第一个姓氏)?我有一个问题给你(抱歉,因此不支持私人消息)。 – harrism 2012-03-04 10:26:10

1

如果您正在使用推力矢量,那么您可以使用所需的复位值对要复位的矢量调用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 */);