是的,你可以。例如看下面的代碼。
- 它宣稱正常指針管理指針和主機指針所有的人都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。
你爲什麼要刪除你的第一個答案? – Shadow
@DavideSpataro:你應該編輯第一個答案,替換文字。 – einpoklum