找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 79|回复: 3

CPU和GPU的异步并行问题

[复制链接]
发表于 2017-7-10 11:17:44 | 显示全部楼层 |阅读模式
ESC4000G3
本帖最后由 Wendy 于 2017-7-10 15:35 编辑

问题描述:在下面所附的程序中 Part 1 表示在CPU上并行执行的部分;Part 2 表示创建核函数,然后在GPU上执行的部分;
                目前的程序:当在CPU上创建的48个线程执行完后,才会创建核函数,执行GPU端的程序。
                我想达到的目的:实现 Part 1 和 Part 2 的并行执行,即CPU和GPU的异步并行,请教怎么实现呢?
  1. <div>HANDLE  hThread[48];
  2. int coef_1_48[48 * 4096 * 128];

  3. DWORD  WINAPI  fun(LPVOID lpParam)
  4. {
  5.   //此处省略 N 行语句
  6.   
  7.   memcpy(coef_1_48 + id * 4096 * 128, coef_1, 4096 * 128 * sizeof(int));  </div><div>  //当 Part 1 执行完后,需要将coef_1_48传递到GPU端。id的值是通过fun传递过来的参数,取值范围是 0~47。
  8.   // int coef_1[4096 * 128];
  9.   
  10.   return 0;

  11. }

  12. main()
  13. {
  14.   int i;
  15.   int frame;
  16.   for(frame=0;frame<576;frame+=48)//一共有576帧图像,每次并行执行48帧的操作,循环 576/48=12 次
  17.   {
  18.     //**********************Part 1 开始******************************
  19.     for(i=0;i<48;i++)
  20.     {
  21.      hThread[i] = CreateThread(NULL, 0, fun, &para;[i], 0, NULL);
  22.     }
  23.   
  24.     for (i = 0; i < 48; i++)
  25.     {
  26.       WaitForSingleObject(hThread[i], INFINITE);   
  27.     }
  28.   
  29.   //***********************Part 1 结束********************************

  30.   //***********************Part 2 开始********************************
  31.    {
  32.      cudaMalloc 分配空间
  33.      cudaMemcpyHostToDevice 复制数组coef_1_48中的数据
  34.      kernel<<<block,thread>>>() 调用核函数
  35.      cudaMemcpyDeviceToHost 返回结果
  36.   }
  37.   
  38.     //***********************Part 2 结束********************************
  39.   
  40.   }}</div>
复制代码


回复

使用道具 举报

发表于 2017-7-11 14:24:29 | 显示全部楼层
Jetson TX2
把第二部分移到第一部分之上就可以了,后面不要加cudaDeviceSynchronize()或cudaStreamSynchronize()这些同步函数,内核执行本就是异步执行的,内核调用时当前cpu线程讲gpu命令发送到gpu上的命令缓冲区后就会立即讲控制权返回给当前线程,而不会等到内核执行完后再返回。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-12 17:00:05 | 显示全部楼层
Tesla P100
sisiy 发表于 2017-7-11 14:24
把第二部分移到第一部分之上就可以了,后面不要加cudaDeviceSynchronize()或cudaStreamSynchronize()这 ...

问题1:在GPU上执行的 Part2 的时间大于在CPU上执行的 Part1 的时间,并且 Part2 需要 Part1 的结果
(即:数组coef_1_48中的数据)作为参数。如果将 Part2 放在 Part1 上面,那么有可能数组coef_1_48
中的数据不完整,无法往设备端传递正确的参数。

问题2:在 Part1 创建线程后,需要用到等待函数 WaitForSingleObject 等待 CPU 端的所有线程执行完后
才能进行 Part2 的操作,这样就导致了CPU 和 GPU仍然是串行执行的。如果不加这个等待函数,是会出
错的,会导致数组coef_1_48中的数据不完整,不能往设备端传递正确的参数。
有什么办法能够解决呢?才能让这种串行变成并行?
回复 支持 反对

使用道具 举报

发表于 2017-7-12 20:09:02 | 显示全部楼层
有数据依赖的话那就无法并行,除非改变算法或是将程序的结构重新设计为更细的力度,然后再从中寻找可重叠的部分
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

快速回复 返回顶部 返回列表