0
我測試的動態分配,即cudaMemGetInfo不是常量?
__device__ double *temp;
__global__
void test(){
temp = new double[125000]; //1MB
}
調用此函數100次,看看內存正在減少:
size_t free, total;
CUDA_CHECK(cudaMemGetInfo(&free, &total));
fprintf(stdout,"\t### Available VRAM : %g Mo/ %g Mo(total)\n\n", free/pow(10., 6), total/pow(10., 6));
for(int t=0;t<100;t++){
test<<<1, 1>>>();
CUDA_CHECK(cudaDeviceSynchronize());
fprintf(stdout,"\t### Available VRAM : %g Mo/ %g Mo(total)\n\n", free/pow(10., 6), total/pow(10., 6));
}
CUDA_CHECK(cudaMemGetInfo(&free, &total));
fprintf(stdout,"\t### Available VRAM : %g Mo/ %g Mo(total)\n\n", free/pow(10., 6), total/pow(10., 6));
,它實際上是。
- 注:當試圖而不調用函數和 cudaMemGetInfo內循環,這是減少從800到650 莫,我得出的結論是到控制檯輸出了〜150密蘇里州 事實上,當嘗試像上面寫的代碼,結果不會 更改。但它是巨大的!
- 循環後我得到約50Mo的可用內存減少(我沒有通過給內核發出有用的評論來減少)。當我在內核中添加一個刪除(temp)時,似乎不會減少浪費的內存量,我仍然會減少~30Mo。爲什麼?
- 循環後使用cudaFree(temp)或cudadeviceReset()也沒有多大幫助。爲什麼?以及如何釋放內存?
好的,謝謝!我對cuda環境的概念仍然有困難,但我正在閱讀文檔。 –
@FrançoisLaenen:上下文是給定GPU上的主機進程/線程特定的「會話」。每個上下文在GPU上都有自己的虛擬地址空間,CUDA運行時支持,代碼和數據將加載到該空間中。在運行時API中,這大部分是隱藏的,但如果您查看驅動程序API文檔,則可以看到顯式調用管理上下文。 – talonmies
好吧,我現在好了。舉例來說,cudaMalloc從主機返回的指針將不會被另一個上下文使用,因爲它將被加載到第一個上下文的VAS中? –