我们可以将“普通”GPU内存复制到“统一”内存吗?

时间:2017-06-09 14:47:14

标签: cuda unified-memory

我们有两个GPU内存,一个用cuMalloc作为普通设备内存分配,另一个用cuMallocManaged作为统一内存分配。它们之间可以复制吗?如果我们使用驱动程序API,我应该使用什么方向?

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

1 个答案:

答案 0 :(得分:2)

是的,你可以。例如,请查看以下代码。

  • 它将正常指针声明为托管指针和主机指针,所有指针均为100 float
  • 然后初始化主机指针中的值,然后使用cudaMemCpy将值复制到 normal 指针。
  • 现在将值复制到托管指针
  • 托管指针在内核中用于显示已从两个缓冲区复制值。

我认为代码非常明显

__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