OpenCL: параллельные очереди на стороне устройства также параллельны? - PullRequest
0 голосов
/ 03 января 2019

Я провожу некоторые тесты, используя очереди команд на стороне устройства в сочетании с вызовами 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 соответствует описанию ... так какое же предположение верно? Или они оба возможны? Специфично поведение поставщика / реализации?

1 Ответ

0 голосов
/ 31 января 2019

Первый вариант. Ядра все еще «отправлены» по порядку. И если ядро ​​A заполнит машину потоками и не оставит места для ядра B, разницы не будет. Но если A не заполняет машину, и out_of_order включен, то ядро ​​B будет отправлено сразу после того, как A завершит диспетчеризацию своих потоков (то есть его потоки все еще могут выполняться). И ядра могут продолжать работать параллельно. Теперь вполне возможно, что спецификация оставила двусмысленность в отношении порядка первой диспетчеризации, но поскольку диспетчеризация ядер последовательно происходит из ЦП, я не вижу рационального объяснения, почему или как поставщик допускает возможность 2.

...