Оптимизация OpenCL и очевидные ограничения шины PCI? - PullRequest
0 голосов
/ 25 августа 2011

Я пишу программу с использованием JOGL / openCL для использования графического процессора.У меня есть код, который срабатывает, когда мы работаем с размерами данных, который должен обнаружить доступную память на GPU.Если на графическом процессоре недостаточно памяти для одновременной обработки всего вычисления, он разбивает процесс на подпроцесс с числом кадров X, которое использует меньше, чем максимальная глобальная память графического процессора для хранения.

Я ожидалчто использование максимально возможного значения X даст мне наибольшее ускорение за счет минимизации количества используемых ядер.Вместо этого я обнаружил, что использование меньшей группы (X / 2 или X / 4) дает мне лучшие скорости.Я пытаюсь понять, почему разбивка обработки на GPU на более мелкие группы, а не на обработку GPU максимальной производительностью, которую он может обработать за один раз, дает мне увеличение скорости;и как я могу оптимизировать, чтобы выяснить, каково наилучшее значение X.

Мои текущие тесты выполнялись на ядре графического процессора, которое использует очень небольшую вычислительную мощность (оба ядра сокращают вывод, выбирая часть ввода и возвращаяэто) Однако, я вполне уверен, что те же самые эффекты происходят, когда я активирую все ядра, которые выполняют большую степень обработки значения перед возвратом.

Ответы [ 2 ]

1 голос
/ 25 августа 2011

Короткий ответ: это сложно.Есть много факторов в игре.К ним относятся (но не ограничиваются ими):

  1. Количество используемой локальной памяти.
  2. Количество используемой вами частной памяти.
  3. Ограничение намаксимальное количество рабочих групп, которое Symmetric Multiprocessor может обработать одновременно.
  4. Превышение ограничений регистра, что приводит к замедлению доступа к памяти.
  5. И многие другие ...

Рекомендую проверить следующую ссылку:

http://courses.engr.illinois.edu/ece498/al/textbook/Chapter5-CudaPerformance.pdf

В частности, ознакомьтесь с разделом 5.3.Динамическое разбиение ресурсов SM .Этот текст предназначен для общего назначения, но использует CUDA для своих примеров.Тем не менее, концепции все еще применимы и к OpenCL.

Этот текст взят из следующей книги:

http://www.amazon.com/Programming-Massively-Parallel-Processors-Hands-/dp/0123814723/ref=sr_1_2?ie=UTF8&qid=1314279939&sr=8-2

Для чего я нашел эту книгубыть очень информативным.Это даст вам более глубокое понимание аппаратного обеспечения, что позволит вам отвечать на такие вопросы.

0 голосов
/ 25 августа 2011

PCI-e являются полнодуплексными двунаправленными. я думаю это означает, что вы можете писать так, как читаете. в этом случае, если вы выполняете очень мало обработки, вы можете увидеть усиление, потому что вы пересекаетесь с записями.

учитывайте общий размер N. в одной рабочей единице, которую вы делаете:

  • напишите N
  • процесс N
  • читать N

общее время, пропорциональное: процесс N, передача 2N

если вы разделите это на две части с параллельным чтением / записью, вы можете получить:

  • запись N / 2
  • процесс N / 2
  • читать N / 2 и писать N / 2
  • процесс N / 2
  • читать N / 2

общее время, пропорциональное: процесс N, передача 3N / 2 (экономия N / 2, время передачи)

...