2013-05-08 2 views
3

У меня есть программа Cuda, что я бегу на 680gtx, при тестировании различных параметров компилятора я заметил, что:CUDA 1,0 быстрее, чем 3,5

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

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


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

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

спасибо.


команды:

куб.см 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" 

куб.см 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" 

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

куб.см 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 

куб.см 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] 
+0

'sm 1.0' vs' sm 3.5' ​​проблемы в стороне, вероятно, было бы неплохо избежать проливания, чтобы стековый фрейм как это. возможно, удалите немного разворота цикла или что-то в этом роде? – solvingPuzzles

ответ

7

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

+1

Спасибо! это, похоже, решает проблему, теперь два ядра имеют сопоставимую производительность. на самом деле при увеличении размера блока компиляция для cc3.0 выглядит скорее примерно на 5%, как и ожидалось :) – BenMatok

+0

Что такое «флеш-ноль» в CC 1.0? – Madhatter

+0

@ Jeb11: посмотрите здесь http://stackoverflow.com/questions/2083550/flush-to-zero-behavior-in-floating-point-arithmetic –

3

Обратите внимание, что 680 не может работать SM 3.5 код - только 3,0. Только Titan может запускать SM 3.5.

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

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

Update

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

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

+0

спасибо за ответ, (0) компилятор заявляет, что cc 3.5 поддерживается, но это также происходит и для cc 2.x (1) вычисление дает те же результаты, никаких ошибок. (2) разница в производительности, по-видимому, достаточно существенна для этого, больше информации об этой проблеме было бы полезно :) – BenMatok

+1

Что вы подразумеваете под компилятором? Компилятор всегда будет компилировать для 3.5 - независимо от того, есть ли у вас Titan или K20 в вашей системе. Если вы имеете в виду пользовательский интерфейс Nsight, то, скорее всего, вы выбрали PTX 1.0, совместимый с вашим устройством. – Eugene

+1

Re: 2 - Я согласен, что 30% -ный удар производительности кажется слишком большим, поэтому я подозреваю, что у вас вообще нет кода графического процессора. Можете ли вы вставить Make output, чтобы просмотреть команды компилятора. – Eugene

0

Я имел дело с тем же вопросом.

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

Другое дело - вычислительная мощность каждой карты cuda. который зависит от количества и типа gpus и скорости вращения штока и т. д.

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

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

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