Интерпретация подробного вывода ptxas, часть II
Этот вопрос является продолжением Интерпретации подробного вывода ptxas, часть I.
Когда мы собираем ядро .ptx
файл с ptxas -v
или скомпилируйте его из .cu
файл с -ptxas-options=-v
мы получаем несколько строк вывода, таких как:
ptxas info : Compiling entry function 'searchkernel(octree, int*, double, int, double*, double*, double*)' for 'sm_20'
ptxas info : Function properties for searchkernel(octree, int*, double, int, double*, double*, double*)
72 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info : Used 46 registers, 176 bytes cmem[0], 16 bytes cmem[14]
(тот же пример, что и в связанном вопросе; но с именем demangling)
Этот вопрос касается последней строки. Еще несколько примеров из других ядер:
ptxas info : Used 19 registers, 336 bytes cmem[0], 4 bytes cmem[2]
...
ptxas info : Used 19 registers, 336 bytes cmem[0]
...
ptxas info : Used 6 registers, 16 bytes smem, 328 bytes cmem[0]
Как мы интерпретируем информацию в этой строке, кроме количества используемых регистров? В частности:
- Является
cmem
сокращение от постоянной памяти? - Почему существуют разные категории
cmem
т.е.cmem[0]
,cmem[2]
,cmem[14]
? smem
вероятно означаетshared memory
; это только статическая разделяемая память?- При каких условиях каждый вид записи появляется в этой строке?
2 ответа
Cmem - это сокращение от постоянной памяти?
да
Почему существуют разные категории cmem, то есть cmem[0], cmem[2], cmem[14]?
Они представляют разные банки постоянной памяти. cmem[0]
является зарезервированным банком для аргументов ядра и постоянных значений статического размера.
SEMEM, вероятно, обозначает общую память; это только статическая разделяемая память?
Это так и как могло быть иначе.
При каких условиях каждый вид записи появляется в этой строке?
Ответ здесь в основном.
Собрано и переформатировано...
Ресурсы на последней информационной строке ptxas:
registers
- в файле реестра на каждом СМ (многопроцессорном)gmem
- Глобальная памятьsmem
- Статическая общая памятьcmem[N]
- Банк постоянной памяти с индексом N.cmem[0]
- Банк зарезервирован для аргумента ядра и постоянных значений статического размераcmem[2]
-???cmem[4]
-???cmem[14]
-???
Каждая из этих категорий будет показана, если ядро использует такую память (регистры - вероятно, всегда отображаются); поэтому неудивительно, что все примеры показывают cmem[0]
использование.
Вы можете прочитать немного больше об иерархии памяти CUDA в Разделе 2.3 Руководства по программированию и ссылках там. Также есть этот пост в блоге о статической и динамической разделяемой памяти.