我知道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 以顺序的方式运行,但是无法找到原因。
cudaMalloc
和cudaFree
是阻塞的,并且在当前GPU上执行的所有内核之间进行同步。 - Jared Hoberock