AMD OpenCL异步执行效率

AMD OpenCL异步执行效率,opencl,gpgpu,Opencl,Gpgpu,例如,我有三个任务A、B和C。其中B和C依赖于A。有足够的CU同时运行B和C。然后我将A和C排队到队列0,B排队到队列1。而且在a完成之后和B开始之前存在巨大的延迟,这使得整个作业比只使用一个队列花费更长的时间 这正常吗?还是我做错了什么 如果需要的话,我将编写一个示例代码,原始代码是经过严格封装的。但实际上我只是在A排队时创建一个事件,并将其传递给B排队,这两个队列在顺序队列中都是正常的。似乎没什么特别的。我找不到关于延迟的信息,但要说正常情况,我们需要统计得出所有平台的延迟基数,以下是我的:

例如,我有三个任务A、B和C。其中B和C依赖于A。有足够的CU同时运行B和C。然后我将A和C排队到队列0,B排队到队列1。而且在a完成之后和B开始之前存在巨大的延迟,这使得整个作业比只使用一个队列花费更长的时间

这正常吗?还是我做错了什么


如果需要的话,我将编写一个示例代码,原始代码是经过严格封装的。但实际上我只是在A排队时创建一个事件,并将其传递给B排队,这两个队列在顺序队列中都是正常的。似乎没什么特别的。

我找不到关于延迟的信息,但要说正常情况,我们需要统计得出所有平台的延迟基数,以下是我的:

HD7870和R7-240表现出相同的性能。视窗10。双通道RAM。OpenCL1.2(64位构建)。CodeXL分析。所有有序队列。一些老司机还没长大

  • 具有非阻塞命令的无事件单队列:几微秒到200微秒波动,但平均值必须较低,如50微秒,取决于驱动程序,对于某些内核,可能由于参数太多和类似的准备工作,它会达到500微秒
  • 事件源=单队列A,事件目标=队列B:100-150微秒到半毫秒(似乎是常数)
  • 事件源=N-1队列列表,事件目标=queue-N:不是所有队列延迟的总和,但隐藏了某种延迟,因此其不超过2毫秒(有时峰值为3-5毫秒,很少)
  • 事件源=队列,由clWaitForEvents从主机等待:大约一毫秒
  • 事件源=队列,在while循环中通过clGetEventInfo从主机等待:将近半毫秒,有时甚至更短
  • clFinish for single queue:这是每个队列的最大延迟,至少为1ms
  • 用户事件:在codeXL中生成错误,因此我无法查询它们的性能,但它是较旧的驱动程序和较旧的codeXL版本
有一些后台进程:avira,谷歌chrome,。。这是先进的,足以使用GPU的目的,并可能会阻碍内核执行

我对这些问题的解决方案是通过使用许多独立队列来隐藏它们的事件延迟,并像一个符咒一样工作。R7-240在16个队列上运行。它只有2个ACE单元,因此拥有4-8个ACE单元的新卡可以处理更多队列


我没有尝试和怀疑的是:N个队列等待完成,M个具有事件列表性能的其他队列。如果许多队列滞后太多,那么树状等待结构可能会更好。

我使用类似的并行队列,并通过HD7870和R7-240看到事件驱动步骤之间的延迟。然后我将队列更改为:A+B+C在同一个队列上,但重复,所以只要有10倍(A+B+C),10个队列就会生成,并且工作速度很快,没有任何口吃。从codeXL时代看,司机处理最佳操作顺序graph@huseyintugrulbuyukisik我猜这很正常。。。有时我只是觉得AMD在开玩笑……在我的斐济设备上,同步执行的延迟只有1微秒,这使得异步执行的延迟像一场噩梦。我想知道是否有一种正确的方法来进行异步执行,而不存在这样的延迟。“事件不应该只是GPU方面依赖的标志吗?”我想。AMD说,这是他们的GPU擅长的,谁知道…1美元比我的卡好。有超过1个Ace单元,因此复制所有队列应该会隐藏它。我猜任务之间的CU必须保持“空闲”1U(更精确地说是1.5U),使用多个队列似乎不会隐藏它。不管怎样,因为每个内核运行大约需要50个U,如果我扩展任务以填充CU,则需要更多。