OpenCL: как распределить вычисления на разные устройства без многопоточности - PullRequest
0 голосов
/ 13 мая 2018

После моего предыдущего поста о сравнении времени, необходимого для выполнения простой операции добавления массивов (C [i] = A [i] + B [i]) на разных устройствах, я улучшил код немного, чтобы повторить процесс для другой длины массива и вернуть необходимое время:

enter image description here Ось X - это длина массива в логарифме с основанием 2, а Y - время в логарифме с основанием 10. Как видно, где-то между 2 ^ 13 и 2 ^ 14, графические процессоры становятся быстрее, чем ЦПУ. Я думаю, это потому, что распределение памяти становится незначительным по сравнению с расчетом. (GPI1 - это опечатка, которую я имел в виду GPU1).

Теперь надеемся, мой код C-OpenCL правильный. Я могу оценить время, необходимое для добавления массива на разных устройствах: f1 (n) для процессора, f2 (n) для первого GPU и f3 (n) для второго GPU. Если у меня есть задание массива с длиной n, я теоретически должен быть в состоянии разделить его на 3 части как n1 + n2 + n3 = n и таким образом, чтобы удовлетворить f1 (n1) = f2 (n2) = f3 (n3 ) и распределите его по трем устройствам в моей системе, чтобы получить максимально быстрый расчет. Я думаю, что могу сделать это с помощью, скажем, OpenMP или любого другого метода многопоточности и использовать ядра моего ЦП для размещения трех различных задач OpenCL. Это не то, что мне нравится делать, потому что:

  1. Это пустая трата ресурсов. Два ядра просто хостинг, но могут быть использованы для расчета
  2. Это делает код более сложным.
  3. Я не уверен, как это сделать. Сейчас я использую компилятор Apple Clang с -framework OpenCL для компиляции кода, но для OpenMP я должен использовать компилятор GNU. Я не знаю, как использовать OpenMP и OpenCL на одном из этих компиляторов.

Теперь я думаю, есть ли способ сделать этот дистрибутив без многопоточности? Например, если одно из ядер ЦП назначает задачи трем устройствам последовательно, а затем фиксирует результаты в том же (или другом) порядке и затем объединяет их. Вероятно, нужно немного поэкспериментировать, чтобы скорректировать время назначения задач подзадачам, но я думаю, это должно быть возможно.

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

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

1 Ответ

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

Проблема, поскольку ее чтение неявно говорит вам, что решение должно быть параллельным (асинхронным), поэтому вам необходимо добавить результаты с трех разных устройств одновременно, в противном случае вам нужно будет сначала запустить процесс на устройстве A, а затемустройство B, а затем устройство C (лучше запускать один процесс на самом быстром устройстве), если вы планируете эффективно научиться использовать программирование OpenCL (на mCPU / GPU), вам должно быть удобно выполнять асинхронное программирование (действительно многопоточное).

...