Вычислительные возможности CUDA 1.0 быстрее, чем 3.5

У меня есть программа cuda, которую я запускаю на 680gtx, при тестировании различных параметров компилятора я заметил, что:

  • компиляция моего кода для вычислительных возможностей 1.0 и sm 1.0 дает время выполнения 47 мс.

  • компиляция моего кода для вычислительных возможностей 3.5 (также 2.0) и sm 3.0 дает время выполнения 60 мс


в чем могут быть причины таких результатов?

Я компилирую на компиляторе nsight на Linux и CUDA 5.0, и мое ядро ​​​​в основном связано с памятью.

благодаря.


команды:

cc 1.0

nvcc --compile -O0 -Xptxas -v -gencode arch=compute_10,code=compute_10 -gencode arch=compute_10,code=sm_10 -keep -keep-dir /tmp/debug -lineinfo -pg -v  -x cu -o  "BenOlaCuda/src/main.o" "../BenOlaCuda/src/main.cu"

cc 3.0

nvcc -lineinfo -pg -O0 -v -keep -keep-dir /tmp/debug -Xptxas -v -gencode arch=compute_30,code=sm_30 -gencode arch=compute_35,code=sm_35 -odir "BenOlaCuda/src" -M -o "BenOlaCuda/src/main.d" "../BenOlaCuda/src/main.cu"

еще немного информации о компиляции моего ядра:

cc 1.0

ptxas info    : Compiling entry function '_Z15optimizePixelZ3tfPfS_S_S_tttttt' for 'sm_10'
ptxas info    : Used 40 registers, 68 bytes smem, 64 bytes cmem[1], 68 bytes lmem

cc 3.0

ptxas info    : Compiling entry function '_Z15optimizePixelZ3tfPfS_S_S_tttttt' for 'sm_30'
ptxas info    : Function properties for _Z15optimizePixelZ3tfPfS_S_S_tttttt
128 bytes stack frame, 100 bytes spill stores, 108 bytes spill loads
ptxas info    : Used 63 registers, 380 bytes cmem[0], 20 bytes cmem[2]

person BenMatok    schedule 08.05.2013    source источник
comment
Если оставить в стороне проблемы sm 1.0 и sm 3.5, вероятно, было бы неплохо избежать такого попадания в кадр стека. возможно, удалить немного разворачивания цикла или что-то в этом роде?   -  person solvingPuzzles    schedule 12.05.2013


Ответы (3)


Около двух лет назад я переключил свое моделирование с CUDA3.2 на CUDA4.0 и испытал снижение производительности примерно на 10%. В Compute Capability 2.0 nVidia представила вычисления с плавающей запятой, соответствующие стандарту IEEE754-2008 (CC 1.0 использовала IEEE754-1985). Это, а также удаление «сброса в ноль» стало причиной падения производительности. Попробуйте скомпилировать исполняемый файл CC 3.0 с флагом компилятора --use_fast_math. Это обеспечивает старую точность CC 1.0.

person Michael Haidl    schedule 10.05.2013
comment
Спасибо! это, кажется, решает проблему, теперь два ядра имеют сопоставимую производительность. на самом деле, при увеличении размера блока компиляция для cc3.0 кажется быстрее примерно на 5%, как и ожидалось :) - person BenMatok; 10.05.2013
comment
Какой был сброс в ноль в CC 1.0? - person ; 11.06.2014
comment
@Jeb11: посмотрите здесь stackoverflow.com/questions/2083550/ - person Michael Haidl; 16.06.2014

Обратите внимание, что 680 не может запускать код SM 3.5 — только 3.0. Только Титан может запустить СМ 3.5.

У меня есть два совершенно разных объяснения разницы, которую вы видите:

  1. На самом деле код графического процессора не выполняется. Это может произойти, если вы скомпилируете «GPU» 1.0 (в отличие от «PTX»). Убедитесь, что вы проверяете значения ошибок для всех вызовов CUDA RT.
  2. В некоторых довольно редких случаях код, скомпилированный в PTX 1.0, будет работать быстрее после JIT-компиляции в 3.0, чем код, скомпилированный непосредственно в 3.0. Это вызвано тем, что для генерации кода GPU/PTX 1.0 и кода SM 2+ используются разные компиляторы. Обратите внимание, что в большинстве случаев код, сгенерированный компилятором 2+, работает быстрее, но были сообщения об обратном для некоторых шаблонов кода.

Обновить

По-видимому, вашему коду требуется много регистров, а компиляция для 3.0 выделяет больше регистров (поскольку эта архитектура имеет большее число регистров), что ограничивает занятость.

Вы можете попробовать поиграть с размером блока и/или ограничить количество регистров, используемых вашим кодом. Трудно делать какие-либо предложения, не видя ваш код и не экспериментируя с профилировщиком. Я бы также посоветовал вам попробовать инструментарий CUDA 5.5, когда он станет доступен — компилятор может пойти на различные компромиссы, улучшающие производительность вашего кода.

person Eugene    schedule 08.05.2013
comment
спасибо за ответ, (0) компилятор утверждает, что cc 3.5 поддерживается, но это также происходит для cc 2.x (1) вычисления дают те же результаты, без ошибок. (2) разница в производительности кажется довольно существенной, поэтому было бы полезно получить дополнительную информацию по этому вопросу :) - person BenMatok; 09.05.2013
comment
Что вы подразумеваете под компилятором? Компилятор всегда позволит вам скомпилировать для 3.5 - независимо от того, есть ли у вас в системе Titan или K20. Если вы имеете в виду пользовательский интерфейс Nsight, то, скорее всего, у вас выбран PTX 1.0, совместимый с вашим устройством. - person Eugene; 09.05.2013
comment
Re: 2. Я согласен с тем, что снижение производительности на 30% кажется слишком большим, поэтому я подозреваю, что у вас вообще не выполняется код GPU. Можете ли вы вставить Make output, чтобы увидеть выданные команды компилятора. - person Eugene; 09.05.2013
comment
вы были правы, компилятор, кажется, компилируется в cc 3.0 , но проблема остается для любой cc 2.x и выше. Я обновил исходный пост, включив в него команду make. - person BenMatok; 09.05.2013

Я занимался тем же вопросом.

Как видно, индекс вычислительных возможностей cuda (1.0 2.0 2.1 3.0 3.5 и т. д.) является индикатором типа операций, которые может выполнять карта cuda. (см.: http://en.wikipedia.org/wiki/CUDA Характеристики и спецификации версии, часть с красно-зеленой таблицей).

Другое дело — вычислительная мощность каждой карты cuda. который зависит от количества и типа графического процессора, скорости оперативной памяти и т. д.

Таким образом, может быть карта «только» cuda 3.0, такая как gtx-760, с 1152 ядрами и cuda 3.0, и может быть другая карта gt 640, 384 ядра, но cuda 3.5)

Единственный код, который можно сравнить на обоих устройствах, должен быть совместим с 3.0 и, вероятно, будет работать намного быстрее на gtx 760, хотя у одного только 3.0, а у 640 3.5.

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

person Sarmes    schedule 01.02.2014