2012-03-01 92 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 */);