2014-11-01 3 views
6

Учитывая, что OpenCL является API-интерфейсом для гетерогенного программирования, он, по определению, обладает огромным штрафом за латентность, связанным с ним. Поэтому ДОЛЖЕН быть асинхронным API для него.Асинхронный API

Однако мне сложно найти асинхронный API в OpenCL.net. Я нашел структуру OpenCl.Net.Event, которая, как представляется, является параметром out в большинстве вызовов API. Однако я никак не могу найти ответ на событие, так как clSetEventCallback отсутствует в opencl.net.

Кто-нибудь знает как await асинхронная операция в opencl.net?

EDIT: Я ненавижу, когда люди с нисходящей нитью, по крайней мере, давая комментарий. Для записи я немного поработал над этой темой, сейчас я читаю книгу об OpenCL, даже загрузил исходный код в проект OpenCL.net безрезультатно. В OpenCL.net имеется небольшая документация.

+0

Что вы подразумеваете под латентностью? Это время, когда функция вызывает блок во время ожидания результатов? – Eric

+0

Например, в OpenCL вам нужно будет загрузить свои данные в память целевого устройства. Это делается путем установки операции загрузки памяти. Пример кода показывает, как это сделать синхронно (путем установки async false и игнорирования объекта 'out'' Event''). С точки зрения реализации загрузка данных на графический процессор является «медленной», когда эта задержка высока (даже если мы просто учитываем задержки GDDR5). Когда у нас есть сотни круглых поездок на GPU через шину PCI-E, мы теряем все выгоды от производительности. Таким образом, я хочу иметь возможность запускать операции и получать уведомление о завершении. – Aron

+0

Я не очень хорошо знаком с openCl, но это не пакетная обработка openCl, о которой мы говорим? Вы хотите тратить как можно больше времени на очереди и как можно меньше времени на ожидание результатов (или чего-либо еще)? – Eric

ответ

1

Я не знаю много о OpenCL.net, но не тот CommandQueue что вы ищете? Вы можете поставить все ваши задачи aynch в порядке с командой Finish, пока все задачи не будут завершены?

Например здесь: GPGPU image processing basics using OpenCL.NET под Изображение обработки часть

Для clSetEventCallback я только нашел clFinish или clWaitForEvents.

Отсносящийся к выписке:

как кажется clSetEventCallback отсутствует opencl.net

Я не мог найти способ сделать то, что вы хотите, извините.

EDIT: Это, кажется, очень интенсивно: Google-Code/GPUTracer. Вы должны взглянуть на OpenCL.cs и Event.cs. Я думаю, они решили вашу проблему.

+0

К сожалению, это не то, что я ищу. Я ищу, как использовать эту команду с 'Blocking', установленным в' false', что является противоположностью каждого учебника, который я нашел до сих пор. Этот учебник предназначен для блокировки/синхронного API. – Aron

+0

Что с этим: https://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clFinish.html (clFinish)? Извините, если я полностью ошибаюсь, просто пытаюсь помочь :) – BendEg

+0

«Блокирует, пока все ранее поставленные в очередь команды OpenCL в командной строке не будут отправлены соответствующему устройству и не будут завершены». Что по определению является OPPOSITE асинхронным. – Aron