Я пытаюсь реализовать ядро глобального сокращения в PTX, которое использует общую память для сокращения в блоке потока (как и все примеры CUDA C). В CUDA C on есть возможность определить массив переменной длины в разделяемой памяти с
extern __shared__ float sdata[];
Как я могу получить эквивалент в PTX?
Что не кажется подходящим, так это массив фиксированной длины, например
.shared .f32 sdata[ LENGTH ];
Так как я хочу, чтобы ядро можно было повторно использовать для разных длин входного массива.
Что я мог бы сделать, это определить одну переменную
.shared .f32 sdata;
и используйте его как базовый адрес массива. В надежде, что она выделена в начале разделяемой памяти. Затем я мог бы получить доступ к элементу массива, например
ld.shared.f32 %r4,[sdata + <offset>]
Также это выглядит немного забавно, потому что sdata
определяется как float
. Но на самом деле это адрес поплавка. В этом смысле приведенная выше строка действительно верна. Однако я не уверен, что это гарантированно правильно, скажем, до тех пор, пока смещение не превышает размер общей памяти, указанный при запуске ядра.
Руководство PTX не объясняет буферы переменной длины в разделяемой памяти.
Кто-нибудь знает, как реализовать буфер переменной длины в PTX?
sdata
, который отмечает начало разделяемой памяти. - person ritter   schedule 26.10.2012