首页 文章

AMD OpenCL异步执行效率

提问于
浏览
2

例如,我有三个任务A,B和C.其中B和C依赖于A.并且有足够的CU同时运行B和C.然后我在队列0上排队A和C,在队列1上排队B.在A完成之后和B启动之前有一个巨大的延迟,这使得整个工作比仅使用一个队列花费更长的时间 .

这是正常的吗?或者我可能做错了什么?

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

1 回答

  • 1

    我找不到有关延迟的信息,但是,为了调用正常的东西,我们需要统计派生所有平台的延迟基数,这是我的:

    HD7870和R7-240表现出相同的行为 . Windows 10.双通道RAM . OpenCl 1.2(64位版本) . CodeXL分析 . 所有有序队列 . 一些老司机才绯红 .

    • eventless single queue with non-blocking commands: 几微秒到200微秒的波动,但平均值必须低至50微秒,并且取决于驱动程序,对于某些内核,它可能会因为太多参数和类似的准备而达到500微秒 .

    • event source = single queue-A, event target = queue-B: 100-150微秒到半毫秒(似乎不变)

    • event source = N-1 queues list, event target = queue-N: 不是所有队列延迟的总和,但是有一些隐藏的延迟,所以它不超过2毫秒(有时很少达到3-5毫秒)

    • event source = queue, waiting by clWaitForEvents from host: 大约一毫秒

    • event source = queue, waiting by clGetEventInfo from host in while-loop: 将近半毫秒,有时甚至更少

    • clFinish for single queue: 每个队列的延迟最大,至少1ms .

    • user events: 在codeXL中生成错误,因此我无法查询其性能,但它是较旧的驱动程序和较旧的codeXL版本 .

    有一些后台进程:avira,google chrome,..这些进程足够先进,可以将GPU用于其目的,并可能阻碍内核执行 .

    我对这些的解决方案是通过使用许多独立队列来隐藏他们的事件延迟并像一个魅力一样工作 . R7-240正好在16个队列上运行 . 它只有2个ACE单元,所以新的卡有4-8个可以使用更多的队列 .

    我没有尝试和想知道的是:N队列等待完成M其他具有事件列表性能的队列 . 如果它们滞后太多,对于许多队列来说,树状等待结构可能会更好 .

相关问题