Мое ядро OpenCL медленнее на более быстрых аппаратных средствах.. Но почему?

Поскольку я заканчивал кодировать свой проект для класса многоядерного программирования, я подошел на что-то действительно странное, которое я хотел обсудить с Вами.

Нас попросили создать любую программу, которая покажет существенное улучшение в том, чтобы быть запрограммированным для многоядерной платформы. Я решил попытаться кодировать что-то на GPU для испытания OpenCL. Я выбрал матричную проблему свертки, так как я довольно знаком с нею (я параллелизировал ее прежде с open_mpi с большим ускорением для больших изображений).

Таким образом, здесь это, я выбираю большой файл GIF (2,5 МБ) [2816X2112], и я выполняю последовательную версию (исходный код), и я получаю в среднем 15,3 секунд.

Я затем выполняю новую версию OpenCL, которую я просто записал на интегрированном GeForce 9400M своего MBP, и я получаю синхронизации 1,26 с в среднем.. Пока неплохо это - ускорение 12X!!

Но теперь я вхожу в свою энергетическую панель средства сохранения для включения “Графического Режима Производительности”, Что режим выключает GeForce 9400M и включает Geforce 9600M GT, который имеет моя система. Apple заявляет, что эта карта дважды с такой скоростью, как интегрированная.

Угадайте то, что, моя синхронизация с помощью видеокарты задницы удара составляет 3,2 секунды в среднем … Мой 9600M, GT, кажется, больше чем в два раза медленнее, чем 9400M..

Для тех из Вас, которые являются склонным OpenCL, я копирую все данные в удаленные буферы перед запуском, таким образом, фактическое вычисление не требует распространения в прямом и обратном направлениях основному поршню. Кроме того, я позволяю OpenCL определить оптимальное локальное-worksize, поскольку я читал, они сделали довольно хорошую реализацию при понимании того параметра..

У кого-либо есть подсказка?

править: полный исходный код с make-файлами здесь http://www.mathieusavard.info/convolution.zip

cd gimage
make
cd ../clconvolute
make
put a large input.gif in clconvolute and run it to see results

11
задан matdumsa 12 April 2010 в 08:15
поделиться

3 ответа

Я столкнулся с той же проблемой, когда тестировал OpenCL на своем MacBook. Я считаю, что это потому, что GeForce 9400M имеет более высокую скорость шины для основного банка памяти, чем Geforce 9600M GT. Таким образом, даже несмотря на то, что Geforce 9600M GT имеет гораздо большую мощность, чем GeForce 9400M, время, необходимое для копирования памяти в графический процессор, слишком велико, чтобы увидеть преимущества более мощного графического процессора в вашей ситуации. Это также может быть вызвано неправильным размером рабочей группы.

Также я нашел этот сайт очень полезным в моем опыте использования OpenCL.

http://www.macresearch.org/opencl

1
ответ дан 3 December 2019 в 08:28
поделиться

Производительность - не единственное различие между GeForce 9400M и Geforce 9600M GT. Большой из них - это дискретный GPU. С этим связано множество различий, среди которых могут иметь влияние следующие:

  • тенденция драйверов пакетировать больше команд
  • память не является однородной. графический процессор обычно обращается только к своей собственной памяти, а драйвер перемещает память вперед и назад по шине PCI-E.

Я уверен, что мне не хватает некоторых ...

Вот несколько идей, которые вы можете попробовать:

  • избегайте вызова clFinish. То, как вы вызываете это между загрузкой памяти и выполнением, заставляет драйвер выполнять больше работы, чем необходимо. Это глохнет GPU.
  • профилируйте свой код, чтобы увидеть , что требует времени. Я еще не знаю о поддержке анализа производительности CL, но с вашими вызовами clFinish он дает вам оценку 1-го порядка, просто измеряя сторону процессора. Обратите внимание, что в целом трудно отличить, что связано с задержкой, а что с пропускной способностью.
1
ответ дан 3 December 2019 в 08:28
поделиться

Я получаю те же результаты, и я не знаю, почему. Мое ядро использует очень минимальное копирование в/из (я предварительно передаю все необходимые данные для всех вызовов ядра и возвращаю только изображение 512x512). Это трассировщик лучей, поэтому работа ядра значительно превосходит копирование назад (400+ мс до 10 мс). Тем не менее, 9600M GT примерно в 1,5-2 раза медленнее.

Согласно листингу nVidia, 9600M GT должен иметь 32 SP (вдвое больше, чем 9400M). Предположительно, она также имеет более высокую тактовую частоту.

9600M GT действительно кажется быстрее в некоторых случаях, например, в играх. См. эти ссылки: http://www.videocardbenchmark.net/video_lookup.php?cpu=GeForce+9600M+GT http://www.videocardbenchmark.net/video_lookup.php?cpu=GeForce+9600M+GT

Согласно ars technica:

Более того, ранние тесты выявили интересный факт о реализации Snow Leopard. Хотя Snow Leopard не позволяет использовать два GPU или переключать GPU на лету для машин, использующих чипсет NVIDIA GeForce 9400M - ограничение, перенесенное из Leopard - похоже, что ОС может использовать оба одновременно в качестве ресурсов OpenCL. Так что даже если у вас на MacBook Pro включен 9600M GT, если в приложении встречается код OpenCL, Snow Leopard может отправить его на обработку 16 ядрам GPU, которые в 9400M находятся в состоянии покоя. Однако обратное не верно - при работе MacBook Pro только с включенным 9400M, 9600M GT полностью отключается для экономии энергии и не может быть использован в качестве ресурса OpenCL.

Это, похоже, противоположно тому, что мы наблюдаем. Кроме того, я явно устанавливаю контекст CL только для одного устройства за раз.

На форумах ars есть предположения, что 9600M GT также не поддерживает удвоение, что объясняет эту проблему. Я могу попробовать написать синтетический бенчмарк для проверки этой гипотезы.

2
ответ дан 3 December 2019 в 08:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: