找回密码
 立即注册
hulin12138 该用户已被删除
发表于 2018-4-14 19:26:41
22511
有一段代码,大致框架如下(伪码中的函数省略了部分参数):
  1. cudaStream_t stream[MAXSTREAM];
  2. for(int i = 0; i < n; i ++)
  3. {
  4.     int *h_toDevice;
  5.     cudaMallocHost((void **)&h_toDevive);
  6.     memset(h_toDevive);

  7.     int *d_toDevice;
  8.     cudaMalloc(&d_toDevice);

  9.     cudaMemcpyAsync(d_toDevice,h_toDevive,stream[i%MAXSTREAM]);

  10.     kernelFunc<<<stream[i%MAXSTREAM]>>>();

  11.     cudaFreeHost(h_toDevice);
  12.     cudaFree(d_toDevice);
  13. }
复制代码
我想用若干个流并行处理一些任务。然而这样做效果很不理想,而且我发现,如果去掉cudaFree和cudaFreeHost函数,程序的运行时间会缩短到原来的十分之一以上(从100多秒缩减到10秒以内)。我怀疑是这两个函数影响了流的并行,于是我将MAXSTREAM由原来的10设置成1,也就是不存在流的并行,那么删不删这两个函数运行时间就相差无几了,都是100多s。上面的程序有什么问题呢,为什么这两个函数会阻碍流的并行呢,求大神解答!




使用道具 举报 回复
发表于 2018-5-14 16:28:44
可以尝试把内存申请和释放的时间排除在运行时间之外再测试一下。
使用道具 举报 回复 支持 反对
发新帖
您需要登录后才可以回帖 登录 | 立即注册

zzczczxczxczx