Я пытаюсь запустить программу на моем графическом процессоре и начать с простого примера. Я изменил первый пример на 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?