Как количественно вычислить компромиссы обработки CUDA-устройств для ядер C?

Недавно я обновился от GTX480 до GTX680 в надежде, что утроенное количество ядер проявит себя как значительный прирост производительности в моем коде CUDA. К моему ужасу, я обнаружил, что ядра памяти CUDA с интенсивной памятью работают на 30% -50% медленнее на GTX680.

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

Ответ 1

Не совсем ответ на ваш вопрос, но некоторая информация, которая может помочь в понимании производительности GK104 (Kepler, GTX680) по сравнению с GF110 (Fermi, GTX580):

На ферми ядра работают на удвоенной частоте остальной части логики. На Кеплере они работают на той же частоте. Это эффективно уменьшает количество ядер на Кеплере, если вы хотите сделать больше яблок для сравнения яблок с Ферми. Таким образом, это оставляет GK104 (Kepler) с 1536/2 = 768 "эквивалентными ядрами Ферми", что на 50% больше, чем 512 ядер на GF110 (Fermi).

Рассматривая количество транзисторов, GF110 имеет 3 миллиарда транзисторов, а GK104 - 3,5 миллиарда. Итак, хотя Kepler имеет в 3 раза больше ядер, он имеет лишь несколько больше транзисторов. Итак, теперь Кеплер не только на 50% больше "эквивалентных ядер Ферми", чем Ферми, но каждый из этих ядер должен быть намного проще, чем у Ферми.

Итак, эти две проблемы, вероятно, объясняют, почему многие проекты видят замедление при портировании в Kepler.

Кроме того, GK104, являющийся версией Kepler для видеокарт, был настроен таким образом, что сотрудничество между потоками происходит медленнее, чем на Fermi (поскольку такое сотрудничество не так важно для графики). Любое потенциальное потенциальное усиление производительности после учета вышеуказанных фактов может быть сведено на нет.

Существует также проблема производительности с плавающей запятой двойной точности. Версия GF110, используемая на картах Tesla, может выполнять двойную точность с плавающей запятой на 1/2 производительности одиночной точности. Когда чип используется в графических картах, производительность двойной точности искусственно ограничена до 1/8 производительности с одной точностью, но это все же намного лучше, чем двойная точность 1/24 GK104.

Ответ 2

Одним из достижений новой архитектуры Kepler является 1536 ядер, сгруппированных по 8 192-ядерным SMX'ам, но в то же время это число ядер является большой проблемой. Поскольку общая память по-прежнему ограничена 48 кб. Поэтому, если вашему приложению требуется много ресурсов SMX, вы не можете выполнять 4 перекоса параллельно на одном SMX. Вы можете профилировать свой код, чтобы найти реальное размещение вашего GPU. Возможные способы улучшения вашего приложения:

  • использовать функции голосового голосования вместо обмена данными с общей памятью;
  • увеличить количество блоков протектора и уменьшить число потоков в одном блоке;
  • оптимизировать глобальные нагрузки/магазины. Kepler имеет 32 модуля загрузки/хранения для каждого SMX (в два раза больше, чем у Kepler).

Ответ 3

Я устанавливаю nvieuw, и я использую coolbits 2.0 для разблокировки ваших шейдерных ядер по умолчанию до максимальной производительности. Кроме того, у вас должны быть оба разъема вашего устройства на 1 дисплей, который можно включить на экране панели управления nVidia 1/2 и на экране 2/2. Теперь вы должны клонировать этот экран с другим, а разрешение экрана Windows - установить режим экрана на расширенный рабочий стол.

С nVidia inspector 1.9 (драйверы уровня BIOS) вы можете активировать этот режим, настроив профиль для приложения (вам нужно добавить файл приложения EXE в профиль). Теперь у вас почти двойная производительность (следите за температурой).

DX11 также имеет функцию тесселяции, поэтому вы хотите переопределить это и масштабировать собственное разрешение. Ваше родное разрешение может быть достигнуто путем рендеринга ниже, чем 960-540P, и пусть 3D-конвейеры делают все остальное масштабируемым до полного hd (в размере и позиции рабочего стола панели управления nv). Теперь масштабируйте нижний res до полноэкранного режима с дисплеем, и у вас есть полный HD с удвоенным количеством рендеринга размера текстуры на лету, и все должно быть хорошо для рендеринга 3D-текстур с экстремальным LOD-смещением (уровень детализации). Ваш дисплей должен быть включен автоматически.

Кроме того, вы можете использовать компьютеры конфигурации sli. Таким образом, я получаю более высокие оценки, чем 3-сторонние слайсы в tessmark. Высокие настройки AA, такие как 32X смешанная выборка, выглядят как hd в качестве AAA (в тессамарке и платформе тяжести). В endscore нет настроек разрешения, поэтому это не важно, что вы создаете собственное разрешение!

Это должно дать вам некоторые реальные результаты, поэтому, пожалуйста, задумчиво прочитайте литературу.

Ответ 4

Я думаю, проблема может заключаться в числе потоковых мультипроцессоров: GTX 480 имеет 15 SM, GTX 680 - только 8.

Количество SMs важно, поскольку не более 8/16 блоков или 1536/2048 потоков (вычислительная способность 2.0/3.0) может находиться на одном SM. Ресурсы, которыми они располагают, например. разделяемая память и регистры, может дополнительно ограничить количество блоков на SM. Кроме того, большее количество ядер на SM на GTX 680 можно использовать только с помощью уровня инструкций parallelism, то есть путем конвейерной обработки нескольких независимых операции.

Чтобы узнать количество блоков, которые вы можете запустить одновременно на SM, вы можете использовать таблицу nVidia CUDA Occupancy Calculator. Чтобы узнать количество разделяемой памяти и регистров, необходимых вашему ядру, добавьте -Xptxas –v в командную строку nvcc при компиляции.