Cuda 我们能复印一份吗;“正常”;GPU内存到a";统一的;记忆?

Cuda 我们能复印一份吗;“正常”;GPU内存到a";统一的;记忆?,cuda,unified-memory,Cuda,Unified Memory,我们有两个GPU内存,一个是作为普通设备内存分配的cuMalloc,另一个是作为统一内存分配的cumalocmanaged。有可能在他们之间复制吗?如果我们使用驱动程序API,我应该使用什么方向 float* normalMem, unifiedMem; cuMalloc(&normalMem, 100); cuMallocManaged(&unifiedMem, 100); cuMemcpyD2D(unifiedMem, normalMem, 100); // ? D2D? o

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

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

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

  • 它声明了一个普通指针、一个托管指针和一个主机指针,它们都是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;
}
\uuuu全局\uuuu
无效测试(浮动*d_ptr){

对于(int i=0;i)你为什么删除了第一个答案?@DavideSpataro:你应该编辑第一个答案,替换文本。