Opencl - единая очередь с 2 устройствами - PullRequest
0 голосов
/ 01 апреля 2019

Я пытаюсь перенести CUDA тест на Opencl. Требуется копия буфера с устройства PCIe-1 на устройство-2 того же типа (той же марки, того же драйвера и т. Д.)

В CUDA все довольно просто: выделите память на устройстве-1 и устройстве-2 и скопируйте

В Opencl: 1. Создайте контекст с обоими устройствами 2. Выделите память для контекста и свяжите ее с устройством 1 с помощью migrateMemObject. повторить то же самое для устройства-2

  • Когда я создаю очередь, мне нужно указать и контекст, и устройство. Таким образом, очередь может быть связана только с устройством и, следовательно, может обращаться только к памяти, связанной с этим устройством (?)

  • Есть ли способ для двух устройств использовать одну очередь?

  • Или есть ли способ скопировать из gfx-mem, связанного с device1, в gfx-mem, связанный с device2, без копирования в основную память?

Спасибо за помощь!

1 Ответ

1 голос
/ 02 апреля 2019

Нет, вы не можете связать два устройства в одну очередь. Вам нужно две очереди для двух устройств. Но ... Если вы читаете документацию clEnqueueMigrateMemObjects, там написано:

Как правило, объекты памяти неявно переносятся на устройство, для которого предназначены команды в очереди, использующие объект памяти

Другими словами, среда выполнения OpenCL отвечает за автоматическую миграцию необходимых буферов на устройство, где будет использоваться thqy.

Вопрос в том, является ли буфер, который вы хотите разделить между устройствами, доступным только для чтения, или он будет записан ядром? Если он предназначен только для чтения, вам вообще не нужно беспокоиться о каких-либо миграциях, просто поставьте ядро ​​в очередь, и среда выполнения скопирует буфер один раз и снова его использует. Если он написан ядрами из обеих очередей (= устройств), то вам нужно правильно упорядочить ядра в очереди с зависимостями событий; в противном случае ядра могут работать в неправильном порядке, и содержимое буфера становится бессмысленным.

Но в любом случае среда выполнения выполняет миграции в фоновом режиме с максимальной эффективностью. clEnqueueMigrateMemObjects полезен только в качестве оптимизации - если вы хотите вручную перекрывать передачу памяти с выполнением ядра. Я бы сконцентрировался на том, чтобы приложение работало надежно, прежде чем пытаться делать какие-либо уловки с clEnqueueMigrateMemObjects.

...