2016-03-31 3 views
0

У меня есть алгоритм распространения луча, который я только что реализовал в ArrayFire. Я использовал бэкэнд OpenCL с моей картой GTX Titan. С OpenCL он работал со скоростью около 25 000 шагов в минуту. Затем я переключил его на бэкэнд CUDA, и производительность увеличилась до 50 000 шагов в минуту. Это было несколько неожиданно, но я полагал, что он может использовать некоторые дополнительные функции, недоступные OpenCL. Затем я выполнил те же тесты, используя мою карту GTX 960. Он работал со скоростью около 22 000 шагов в минуту с OpenCL и 23 000 с CUDA. Это вызывает недоумение, поскольку я ожидал, что он будет следовать той же схеме, что и Титан. Также я думаю, что я видел изменение производительности 2x на моем ноутбуке, используя GT 730M. Я слышал, что nvidia замедляет OpenCL на некоторых картах. Они делают это для серии 700?OpenCL в два раза медленнее, чем CUDA на GTX Titan

+5

NVIDIA не замедляет OpenCL на некоторых картах. –

+1

В этом уравнении слишком много переменных. Некоторый код должен быть показан здесь. Необходимо использовать версию arrayfire и cuda. –

+2

Также удалите спекулятивный вопрос с конца вашего вопроса. По нашему опыту, при прочих равных условиях производительность opencl и cuda на графических процессорах nvidia (для ядер, реализованных нами) довольно схожи. Различия исходят от основных библиотек, таких как clBLAS и clFFT, которые не оптимизированы для NVIDIA GPUS, в отличие от cuBLAS и cuFFT. –

ответ

3

Поскольку у вас не было никакого кода, я могу предложить только профайлер. Например, я использую codexl of amd, и все снимки берутся из чрезмерно синхронизированного алгоритма свертки, используя область кисти 50x50, вычисляющую матрицу 768x768. Имея множество целых чисел и локальных целых массивов и целочисленных операций и в то же время много операций fp в конце, приводит к некоторым проблемам (работа сбалансирована на 3 устройствах).

Я уверен, что у nvidia есть аналогичное программное обеспечение для обнаружения дыр в вашем приложении.

  • Профилирование времени процессора за функцию позволяет вам узнать о горячих точках на стороне хоста. Лучшие 5 самых трудоемких функций, перечисленных здесь. Таким образом, вы можете оптимизировать функции хоста. (Нажав на одну из функций приводят подробные счетчики производительности инструкций процессора на ядро)

cpu time

  • Ядро анализа показывает, если есть какие-либо узкие места векторных единиц, скалярных , операции с памятью и многое другое. Здесь можно увидеть заполнение ядра и числа волновых фронтов, но они десятки других вещей с правой стороны.

kernel analyzer

При нажатии на kerneloccupancy ячейку, вы можете увидеть источник узких мест в деталях, как в изображении ниже:

enter image description here

  • Применение график трассировки профилирование выявляет пробелы между ndRangeKernel, операции чтения-записи, clFinish и другие методы API, чтобы вы могли видеть, есть ли избыточные сикронизации, узкие места в многопоточных операциях и mem ORY утечки. (ниже рисунке показаны отверстия в вертикальном и горизонтальном направлениях, так как этот пример не имеет асинхронных операций в устройстве, и есть избыточные синхронизаций)

enter image description here

  • Также GTX 960 не может бить титана если рабочая нагрузка достаточно велика для 960 и достаточно мала для титана (возможно, это просто api-служебная нагрузка, вызванная разной обработкой устройства). Это может быть титан, имеющий 192 ядра на единицу (лучше для 384 - 768 потоков на группу) и gtx960, имеющих 128 ядер на единицу (лучший параллелизм для 256 - 512 -1024 потоков на группу)
  • 25000 итераций в минуту составляет 416 второй - около 2,5 миллисекунд на шаг. 2,5 миллисекунды означает, что вы можете перенести всего 10-40 МБ на этот фрагмент времени. Что такое размер буферов, которые отправляются?Чрезмерные функции clFinish вызывают по меньшей мере сотни микросекунд, которые имеют наблюдаемую задержку, когда время ядра сравнимо (например, 1-2 миллисекунды)

  • Увеличьте масштаб выполнения, так что титан загружен достаточно для достижения оптимальной производительности (а не пиковой).

  • Когда рабочая нагрузка слишком мала, мой R7-240 (320 ядер) превосходит мой HD7870 (1280 ядер), потому что коэффициент заполнения ядра выше в r7, поскольку на единицы расчета больше волновых фронтов, а ALU -% 100 (занятие), также есть меньше вычислительных единиц для подготовки к вычислению (накладные расходы) и меньше синхронизации в аппаратных средствах (накладные расходы). Вот почему существуют разные категории для таких тестов, как «производительность» и «крайность». Кроме того, более новые архитектуры работают ближе к их максимальным характеристикам.

  • Возможно, gtx 960 может не управлять 3-мя приложениями с массивом, запущенными одновременно (@ 15000/m), в то время как титан может управлять одновременно 8-10 x приложениями (например, 15000/м) (если вы выбираете параллельность уровня приложения, а не просто увеличиваете рабочий размер на каждый шаг).

Редактировать: Пример кода на самом деле вычисления взаимодействия диффузионного типа. Равновесное состояние области вокруг исходного материала круг-образную форму:

enter image description here

Цвет полосатость происходит от округления до FP 0-255 диапазона целого числа для всех цветовых каналов (RGBA-1 байт каждый, должен использовать поплавки, но недостаточно бюджета pci-e)

+0

Я оставляю данные на gpu между шагами. Я делаю только от 20 до 50 шагов, чтобы минимизировать накладные расходы на передачу данных. Также моя сетка имеет размер 1024x1024. Согласно X-Server nvidia, я использую 99% титанов. – chasep255

+3

Где вы получили доступ к его заявлению? –

+0

с сайта amd. страница разработчика. Также важно вычислить коэффициент передачи. –

Смежные вопросы