Интерпретация подробного вывода 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]

(тот же пример, что и в вопросе, связанном с, но с расшифровкой имени)

Этот вопрос касается последней строки. Еще несколько примеров из других ядер:

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; это только статическая общая память?
  • При каких условиях каждый вид записи появляется в этой строке?

person einpoklum    schedule 16.05.2019    source источник
comment
Да, cmem относится к постоянной памяти. Различные категории (банки) описаны здесь. Я не вижу smem нигде в этом вопросе или в связанном вопросе, но он не может ссылаться на динамическую общую память, поскольку она неизвестна (по размеру) во время компиляции.   -  person Robert Crovella    schedule 16.05.2019


Ответы (2)


Является ли cmem сокращением от постоянной памяти?

да

Почему существуют разные категории cmem, например cmem[0], cmem[2], cmem[14]?

Они представляют собой разные банки постоянной памяти. cmem[0] — это зарезервированный банк для аргументов ядра и постоянных значений статического размера.

smem, вероятно, означает разделяемую память; это только статическая общая память?

Так и есть, а как иначе.

При каких условиях каждый вид записи появляется в этой строке?

В основном отвечали здесь.

person Community    schedule 16.05.2019
comment
+1 за информацию, но я чувствую, что ответ изложен в чрезмерно разговорной манере, поэтому я тоже позволил себе написать его. - person einpoklum; 17.05.2019

Собраны и переформатированы...

Ресурсы в последней информационной строке ptxas:

  • registers - в файле реестра на каждом SM (многопроцессорном)
  • gmem — глобальная память
  • smem — статическая общая память
  • cmem[N] - Constant memory bank with index N.
    • cmem[0] - Bank reserved for kernel argument and statically-sized constant values
    • cmem[2] - ???
    • cmem[4] - ???
    • cmem[14] - ???

Каждая из этих категорий будет показана, если ядро ​​использует какую-либо такую ​​память (Регистры - вероятно, всегда отображаются); поэтому неудивительно, что все примеры демонстрируют некоторое cmem[0] использование.

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

person einpoklum    schedule 16.05.2019