我对以下代码片段有一个相当奇怪的观察。
当我两者都做时 - 将内存复制到设备并将结果复制回主机时,流似乎是同步的 - 即它们按顺序执行内核。一旦我将副本删除到主机并将参数复制到设备,流将并行执行,一旦我删除复制参数并继续复制结果,流也会并行执行。
任何想法为什么?以及如何解决问题?
for (int j=0; j<n_streams; j++) {
cuMemcpyHtoDAsync(gpu_parameters[j], parameters[j].asPointer(), (parameterCount) * Sizeof.FLOAT, stream[j]);
Pointer kernelParameters1 = Pointer.to(
Pointer.to(new int[]{0}),
Pointer.to(new int[] {10000}),
Pointer.to(gpu_data),
Pointer.to(gpu_results[j]),
Pointer.to(gpu_parameters[j])
);
cuLaunchKernel(function[j],
s_grid, 1, 1, // Grid dimension
s_block, 1, 1, // Block dimension
0, stream[j], // Shared memory size and stream
kernelParameters1, null // Kernel- and extra parameters
);
cuMemcpyDtoHAsync(results[j].asPointer(), gpu_results[j], (results[j].size()) * Sizeof.FLOAT, stream[j]);
}