我正在使用设备端乱序命令队列以及对enqueue_kernel的调用来进行一些测试,以使它们正常工作。
我的问题是关于初始化时在设备端队列上设置的CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE标志的性质。
按照规范:
“如果...的CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE属性 设置了commandqueue,那么就不能保证内核A将 在内核B开始执行之前完成。 “
但是,该措辞留下了两种(模棱两可)的可能性:
内核A启动,内核B启动,内核B完成,内核A完成(它们按顺序启动,但并行运行,允许无序完成/执行)
内核B启动,内核B完成,内核A启动,内核A完成(它们按顺序运行,但是顺序启动)
可能的情况2是我所期望的,但是可能的情况1符合描述...那么哪个假设是正确的?还是两者都有可能?行为供应商/实施是否特定?
答案 0 :(得分:0)
第一个选项。内核仍按顺序“分派”。而且,如果内核A用线程填充了计算机,并且没有为内核B留出空间,则没有任何区别。但是如果A没有填充机器,并且启用了out_of_order,那么将在A完成分配其线程之后立即分配内核B(即其线程仍可以执行)。而且内核可以继续并行运行。 现在,规范可能就第一次派遣的顺序变得模棱两可,但是由于内核的派发是顺序地从CPU中发出的,因此我不认为供应商为何或如何允许可能性2的任何合理性。