2011-05-27 99 views
1

我發現了CUDA的奇怪行爲。在我的內核中發生segfault後,我試圖釋放之前分配的內存,並且失敗。 CUDA會自動執行嗎?我的意思是,在內核執行期間發生段錯誤後,CUDA是否可用內存?CUDA在內核執行後釋放內存時出錯

這裏是重現我的情況的代碼。我已經測試了在CUDA 4.0,4.0rc2和3.2

#include <cassert> 

__global__ void segfault(){ 
    int* null = NULL; 
    *null = 0; 
} 

int main() { 
    int* i; 
    assert (cudaSuccess == cudaHostAlloc(&i, sizeof(int)*100, cudaHostAllocMapped)); 
    segfault<<<1,100>>>(); 
    assert (cudaErrorLaunchFailure == cudaThreadSynchronize()); 
    assert (cudaErrorLaunchFailure == cudaGetLastError()); 
    assert (cudaSuccess == cudaGetLastError()); 
    assert (cudaSuccess == cudaFreeHost(i)); 
    return 0; 
} 
+0

我已經在nvidia的論壇上發佈了queston:http://forums.nvidia.com/index.php?showtopic=201389 – kokosing 2011-05-27 13:45:28

回答

1

以我的經驗,一旦你達到那種在CUDA執行錯誤的,所有的後續操作將直到重置設備失效。該文檔指出內存的範圍是CUDA上下文,所以當你銷燬上下文時(通過重置設備),內存將被釋放。

+0

所以我通過兩次'cudaGetLastError'來重置segfault的錯誤,是不是不足? – kokosing 2011-05-27 14:04:53

+0

我想你必須銷燬並重新創建CUDA上下文,就像Edric寫的那樣。 – harrism 2011-05-30 00:25:23