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 は連続して実行されており、その理由を見つけることができません。