2013-05-02 126 views
1

我正在使用caps openacc編譯器。我想知道可以自己管理記憶的東西嗎?openACC:內存管理

例如與CUDA定期OpenACC的代碼是:

#pragma acc kernels copyin(a,b) copy(c) 
    for (i = 0; i < SIZE; ++i) 
    for (j = 0; j < SIZE; ++j) 
     for (k = 0; k < SIZE; ++k) 
     c[i][j] += a[i][k] * b[k][j]; 

我想用這種方式

//allocation 
cudaMalloc((void**)&a, num_bytes); 
cudaMalloc((void**)&b, num_bytes); 
cudaMalloc((void**)&c, num_bytes); 

//transfer-in 
cudaMemcpy(hostA, a, num_bytes, cudaMemcpyHostToDevice); 
cudaMemcpy(hostB, b, num_bytes, cudaMemcpyHostToDevice); 

//computation 
//i think it will be generated as codelet by CAPS openACC compiler. 
#pragma acc kernels 
    for (i = 0; i < SIZE; ++i) 
    for (j = 0; j < SIZE; ++j) 
     for (k = 0; k < SIZE; ++k) 
     c[i][j] += a[i][k] * b[k][j]; 

cudaMemcpy(c, hostC, num_bytes, cudaMemcpyDeviceToHost); 
cudaFree(&a);cudaFree(&b);cudaFree(&c); 

回答

2

是的,你可以自己分配內存的變化。在你的榜樣,應該可以這樣使用device_ptr編譯來實現的,所以像:

cudaMalloc((void**)&a, num_bytes); 
cudaMalloc((void**)&b, num_bytes); 
cudaMalloc((void**)&c, num_bytes); 

cudaMemcpy(hostA, a, num_bytes, cudaMemcpyHostToDevice); 
cudaMemcpy(hostB, b, num_bytes, cudaMemcpyHostToDevice); 

#pragma acc data deviceptr(a, b, c) 
#pragma acc kernels 
    for (i = 0; i < SIZE; ++i) 
    for (j = 0; j < SIZE; ++j) 
     for (k = 0; k < SIZE; ++k) 
     c[i][j] += a[i][k] * b[k][j]; 

cudaMemcpy(c, hostC, num_bytes, cudaMemcpyDeviceToHost); 
cudaFree(a);cudaFree(b);cudaFree(c); 

[免責聲明:寫在瀏覽器中,從來沒有編譯或測試,在風險自負]

這應該申報a,bc是對編譯器的預先分配。如果您願意,您還應該能夠使用OpenACC acc_malloc例程來分配內存來代替cudaMalloc

感謝@ user2054656指出我在本答案的第一個版本中錯誤使用device_resident

2

我同意talonmies的帖子,只是您應該使用data附註的deviceptr子句。我這樣說是因爲device_resident確實請求OpenACC實現來分配內存,而device_ptr則沒有。 你並不需要分配內存,因爲它已經通過用戶與cudaMalloc()

+0

感謝校正分配的,我是從內存張貼在火車上時,我寫我的答案,得到了'device_resident'錯誤的意圖.. 。 – talonmies 2013-05-03 14:58:04