有一段代码,大致框架如下(伪码中的函数省略了部分参数):
cudaStream_t stream[MAXSTREAM];
for(int i = 0; i < n; i ++)
{
int *h_toDevice;
cudaMallocHost((void **)&h_toDevive);
memset(h_toDevive);
int *d_toDevice;
cudaMalloc(&d_toDevice);
cudaMemcpyAsync(d_toDevice,h_toDevive,stream[i%MAXSTREAM]);
kernelFunc<<<stream[i%MAXSTREAM]>>>();
cudaFreeHost(h_toDevice);
cudaFree(d_toDevice);
}
我想用若干个流并行处理一些任务。然而这样做效果很不理想,而且我发现,如果去掉cudaFree和cudaFreeHost函数,程序的运行时间会缩短到原来的十分之一以上(从100多秒缩减到10秒以内)。我怀疑是这两个函数影响了流的并行,于是我将MAXSTREAM由原来的10设置成1,也就是不存在流的并行,那么删不删这两个函数运行时间就相差无几了,都是100多s。上面的程序有什么问题呢,为什么这两个函数会阻碍流的并行呢,求大神解答!