Cudamalloc会同步主机和设备



我知道cudamcpy会同步主机和设备,但是cudamalloc或cudafree怎么样?

基本上,我想在多个GPU设备上异步将内存分配/复制和内核执行,而我的代码的简化版本就是这样:

void wrapper_kernel(const int &ngpu, const float * const &data)
{
 cudaSetDevice(ngpu);
 cudaMalloc(...);
 cudaMemcpyAsync(...);
 kernels<<<...>>>(...);
 cudaMemcpyAsync(...);
 some host codes;
}
int main()
{
 const int NGPU=3;
 static float *data[NGPU];
 for (int i=0; i<NGPU; i++) wrapper_kernel(i,data[i]);
 cudaDeviceSynchronize();
 some host codes;
}

但是,GPU正在顺序运行,找不到原因。

尝试为每个GPU使用cudaStream_t。以下是从cuda样品中取的simplemultigpu.cu。

 //Solver config                                                          
TGPUplan      plan[MAX_GPU_COUNT];
//GPU reduction results                                                                                   
float     h_SumGPU[MAX_GPU_COUNT];
....memory init....
//Create streams for issuing GPU command asynchronously and allocate memory (GPU and System page-locked)                             for (i = 0; i < GPU_N; i++)
{
    checkCudaErrors(cudaSetDevice(i));
    checkCudaErrors(cudaStreamCreate(&plan[i].stream));
    //Allocate memory                                                                                                                    checkCudaErrors(cudaMalloc((void **)&plan[i].d_Data, plan[i].dataN * sizeof(float)));
    checkCudaErrors(cudaMalloc((void **)&plan[i].d_Sum, ACCUM_N * sizeof(float)));
    checkCudaErrors(cudaMallocHost((void **)&plan[i].h_Sum_from_device, ACCUM_N * sizeof(float)));
    checkCudaErrors(cudaMallocHost((void **)&plan[i].h_Data, plan[i].dataN * sizeof(float)));
    for (j = 0; j < plan[i].dataN; j++)
    {
        plan[i].h_Data[j] = (float)rand() / (float)RAND_MAX;
    }
}
....kernel, memory copyback....

这是使用多GPU的一些指南。

您看到GPU操作依次运行的最可能的原因是cudaMalloc是异步的,但是cudaFree不是(只需在CPU线程上排队并在cpu线程上排队并在a的末尾发送免费请求系列操作)。

您需要使用固定内存进行从CPU内存到GPU内存的异步传输,CUDA提供了两个实用程序函数cudaMallocHostcudaFreeHost(而不是mallocfree)。顺便说一句,还有cudaHostAlloc可用于精细控制,请阅读CUDA手册以获取详细信息。

最新更新