我知道 cudaMemcpy 会同步主机和设备,但是 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 是按顺序运行的,找不到原因。