Программирование на GPU через JOCL использует только 6 из 80 шейдерных ядер? - PullRequest
0 голосов
/ 04 января 2012

Я пытаюсь запустить программу на моем графическом процессоре и начать с простого примера. Я изменил первый пример на http://www.jocl.org/samples/samples.html и запустил следующий небольшой скрипт: я запускаю одновременно n «потоков» (чтоправильное имя для графического эквивалента потока?), каждое из которых выполняет 20000000 / n независимых tanh () - вычислений.Вы можете увидеть мой код здесь: http://pastebin.com/DY2pdJzL

Скорость далеко не та, которую я ожидал:

  • для n = 1 это занимает 12,2 секунды
  • дляn = 2 - 6,3 секунды
  • для n = 3 - 4,4 секунды
  • для n = 4 - 3,4 секунды
  • для n = 5 - 3,1 секунды
  • для n = 6 и выше, это занимает 2,7 секунды.

Таким образом, после n = 6 (будь то n = 8, n = 20, n = 100, n = 1000 или n = 100000) повышение производительности отсутствует, что означает только 6 из них.вычисляются параллельно.Тем не менее, согласно спецификациям моей карты должно быть 80 ядер: http://www.amd.com/us/products/desktop/graphics/ati-radeon-hd-5000/hd-5450-overview/pages/hd-5450-overview.aspx#2

Это не вопрос накладных расходов, так как увеличение или уменьшение 20000000 имеет значение только линейный коэффициент во всех временах выполнения.

Я установил AMD APP SDK и драйверы, поддерживающие OpenCL: подробности см. http://dl.dropbox.com/u/3060536/prtscr.png и http://dl.dropbox.com/u/3060536/prtsrc2.png (или, по крайней мере, из этого я заключаю, что OpenCL работает правильно).

Так что я немного не знаю, где искать ответ.Почему JOCL может выполнять 6 параллельных операций на моем ATI Radeon HD 5450?

1 Ответ

1 голос
/ 04 января 2012

Вы жестко программируете локальный размер работы до 1. Используйте больший размер или позвольте водителю выбрать один для вас.

Кроме того, ваше ядро ​​не разработано в стиле OpenCL. Вы должны удалить цикл for и позволить драйверу обрабатывать итерации для вас.

...