Разница между поверхностной памятью Кеплера и Максвелла
Учитывая следующие инструкции низкого уровня (SASS) для последних двух поколений графических процессоров NVIDIA (ref http://docs.nvidia.com/cuda/cuda-binary-utilities/index.html), каковы (возможно, предполагаемые) различия в структуре иерархии оборудования / памяти (и последствия для производительности)?
Инструкции по поверхностной памяти MAXWELL
SUATOM Surface Reduction
SULD Surface Load
SURED Atomic Reduction on surface memory
SUST Surface Store
Инструкции по поверхностной памяти KEPLER
SUCLAMP Surface Clamp
SUBFM Surface Bit Field Merge
SUEAU Surface Effective Address
SULDGA Surface Load Generic Address
SUSTGA Surface Store Generic Address
1 ответ
Массивы CUDA обертывают собственные макеты массивов NVIDIA, оптимизированные для 2D и 3D локализаций. Перевод от координат к адресу преднамеренно запутан разработчиками, поскольку он может меняться от одной архитектуры к другой. Похоже, что NVIDIA решила обернуть этот перевод по-разному - от Kepler до Maxwell, поскольку Kepler внедряет более "RISC-подобный" подход. SASS разборка из surf2dmemset
Пример из Руководства CUDA ( https://github.com/ArchaeaSoftware/cudahandbook/blob/master/texturing/surf2Dmemset.cu) показывает 6 инструкций для записи выходных данных:
SUCLAMP PT, R8, R7, c[0x0][0x164], 0x0;
SUCLAMP.SD.R4 PT, R6, R6, c[0x0][0x15c], 0x0;
IMADSP.SD R9, R8, c[0x0][0x160], R6;
SUBFM P0, R8, R6, R8, R9;
SUEAU R9, R9, R8, c[0x0][0x154];
SUSTGA.B.32.TRAP.U8 [R8], c[0x0][0x158], R10, P0;
по сравнению с Максвеллом:
SUST.D.BA.2D.TRAP [R2], R8, 0x55;
"EA" в инструкциях Kepler означает "эффективный адрес", это более сложный вариант инструкции LEA (эффективный адрес загрузки) в наборах команд CISC.
Что касается SURED/SUATOM
это должны быть поверхностные эквиваленты GRED/GATOM
, Оба выполняют атомарные операции, но ATOM
варианты возвращают предыдущее значение ячейки памяти и RED
вариантов нет. Им не нужны разные внутренние свойства; компилятор выдает правильную инструкцию автоматически.