2017-06-09 66 views
4

我們有兩個GPU內存,其中一個分配爲cuMalloc作爲正常的設備內存,另一個分配爲cuMallocManaged作爲統一內存。它們之間可以複製嗎?如果我們使用驅動程序API,我應該使用什麼方向?我們可以將「普通」GPU內存複製到「統一」內存嗎?

float* normalMem, unifiedMem; 
cuMalloc(&normalMem, 100); 
cuMallocManaged(&unifiedMem, 100); 
cuMemcpyD2D(unifiedMem, normalMem, 100); // ? D2D? or D2H? or else? 

回答

1

是的,你可以。例如看下面的代碼。

  • 它宣稱正常指針管理指針和主機指針所有的人都100 float的。
  • 然後,它初始化主機指針中的值,然後使用cudaMemCpy將值複製到正常指針。
  • 現在將值複製到託管指針
  • 託管指針在內核中用於顯示已從兩個緩衝區複製值。

我認爲代碼是不言自明

__global__ 
void test(float* d_ptr){ 
    for(int i=0;i<100;i++) 
     printf("%f \n",d_ptr[i]); 
    printf("\n"); 
} 

//////////////////////////////////////////////////////////////////////////////// 
// Program main 
//////////////////////////////////////////////////////////////////////////////// 
int main(int argc, char **argv) 
{ 

    size_t size = sizeof(float)*100; 
    float* h_p =(float*) malloc(size); 
    float* d_p, dm_p ; 
    cudaMalloc(&d_p,size); 
    cudaMallocManaged(&dm_p,size); 

    for(int i=0;i<100;i++) 
     h_p[i]=2*(float)i; 

    cudaMemcpy(d_p,h_p,size,cudaMemcpyHostToDevice); 

    cudaDeviceSynchronize(); 

    cudaMemcpy(dm_p,d_p,size,cudaMemcpyDeviceToDevice); 

    cudaDeviceSynchronize(); 

    test<<<1,1>>>(dm_p); 

    cudaDeviceSynchronize(); 

    cudaFree(dm_p); 
    cudaFree(d_p); 
    free(h_p); 
    return 0; 
} 

記住read the Unified Memory access rules

+0

你爲什麼要刪除你的第一個答案? – Shadow

+0

@DavideSpataro:你應該編輯第一個答案,替換文字。 – einpoklum

相關問題