【发布时间】:2012-12-08 14:39:40
【问题描述】:
我知道 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 谢谢!那么,是否有 cudaMalloc 或 cudaFree 的同步版本,例如 cudaMemcpyAsyn?
-
@Jared Hoberock 我的意思是上述评论中的异步版本。
-
不,但您可以通过在内核内部调用
malloc和free来制作自己的。 -
@Jared Hoberock 我有 CUDA4.0,但我怀疑是否支持从内核内部调用 malloc 和 free
标签: cuda