OpenCL: сравнение времени, необходимого для добавления двух массивов целых чисел на доступных платформах / устройствах - PullRequest
0 голосов
/ 12 мая 2018

Я очень новичок во всем мире OpenCL, поэтому я следую некоторым учебникам для начинающих. Я пытаюсь объединить , и , , чтобы сравнить время, необходимое для добавления двух массивов вместе на разных устройствах. Однако я получаю непонятные результаты. Учитывая, что код слишком длинный, я сделал этот GitHub Gist .

На моем Mac у меня есть 1 платформа с 3 устройствами. Когда я назначаю j в

cl_command_queue command_queue = clCreateCommandQueue(context, device_id[j], 0, &ret);

вручную до 0, кажется, запустить расчет на ЦП (около 5,75 секунд). при установке 1 и 2 время расчета резко падает (0,01076 секунд). Я полагаю, это потому, что вычисления выполняются на моем Intel или AMD GPU. Но тогда есть некоторые проблемы:

  1. Я могу настроить j на любое большее число, и оно все еще работает на графических процессорах.
  2. Когда я помещаю все вычисления в цикл, время, измеренное для всех устройств, совпадает с временем вычислений на CPU (как я полагаю).
  3. Время, необходимое для расчета для всех 0<j, подозрительно близко. Интересно, действительно ли они запускаются на разных устройствах?

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

P.S. Я также разместил этот вопрос здесь, в Reddit

1 Ответ

0 голосов
/ 12 мая 2018

Перед тем, как отправлять вопрос по вашей проблеме, всегда не забывайте проверять наличие ошибок (в частности, в этом случае каждый вызов API возвращает CL_SUCCESS). В противном случае результаты не имеют смысла.

В конкретном случае проблема в вашем коде заключается в том, что при получении идентификаторов устройств вы получаете только один идентификатор устройства (строка 60, третий аргумент), что означает, что все остальное в буфере является поддельным, и результаты для j > 0 не имеют смысла.

Единственное, что удивляет, это то, что он не падает.

Кроме того, при проверке времени выполнения используйте события OpenCL, а не время на стороне хоста. В вашем случае вы, по крайней мере, делаете это после clFinish, поэтому вы гарантируете, что выполнение ядра завершается, но вы, по сути, считаете время, необходимое для всей установки, а не только время копирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...