使用C++切换GPU设备后是否需要重新执行cudaHostRegister?
跨GPU设备切换时的页锁定内存复用测试
测试显示,在切换GPU设备过程中,不需要对同一页锁定内存重复执行cudaHostUnregister和cudaHostRegister操作,实际内存传输性能与GPU共享内存的表现没有明显差异。
测试代码示例
// 设置当前设备为0 cudaError_t cudaStatus = cudaSetDevice(0); // 分配缓冲区 int size = 8192; float* cpuBuffer = new float[size * size]; auto totalBytes = sizeof(float) * size * size; cudaHostRegister((void*)cpuBuffer, totalBytes, cudaHostRegisterPortable); float* gpuBuffer = nullptr; cudaMalloc((void**)&gpuBuffer, totalBytes); // 数据传输:主机到设备 cudaMemcpy((void*)gpuBuffer, (const void*)cpuBuffer, totalBytes, cudaMemcpyHostToDevice); // 释放设备端内存 cudaFree(gpuBuffer); // 无需执行cudaHostUnregister(cpuBuffer); // 切换到设备1 cudaStatus = cudaSetDevice(1); cudaMalloc((void**)&gpuBuffer, totalBytes); // 无需再次执行cudaHostRegister((void*)cpuBuffer, totalBytes, cudaHostRegisterPortable); // 数据传输:主机到设备 cudaMemcpy((void*)gpuBuffer, (const void*)cpuBuffer, totalBytes, cudaMemcpyHostToDevice); // 清理资源 cudaFree(gpuBuffer); cudaHostUnregister(cpuBuffer); delete[] cpuBuffer;
内容的提问来源于stack exchange,提问作者Philip Zhang
相关产品推荐
相关产品推荐

