Предположим, у меня есть двумерный массив в C ++ под CUDA, хранящийся в общей памяти,
вот так:
__shared__ float arr[4][4]; // C++ has a default row-major ordering
По умолчанию C ++ упорядочит элементы в arr
в мажорном формате.
То есть он будет выделять непрерывный блок памяти и хранить элементы вроде этого (0,0), (0,1), (0,2), (0,3), (1,0), (1,1 ), … и так далее…
Есть ли способ сказать компилятору C ++ / CUDA расположить это в порядке столбцов?
Почему бы вам просто не поменять используемые вами индексы?
Вместо того, чтобы использовать arr[x][y]
использование arr[y][x]
,
Интересно, почему вы хотели бы сделать это. Может быть, использование кеш-памяти может быть полезным, но я не могу сказать наверняка без подробностей.
Надеюсь, это поможет.
Транспонировать матрицу. arr[4][4]
Значит это arr
является массивом из 4 массивов размера 4. Причина для хранения значений в порядке «основной строки» заключается в том, что arr[0]
например, должен дать нам указатель на первый из этих четырех массивов, а элементы одного массива должны быть размещены в смежных местах памяти, чтобы на них можно было ссылаться по отдельности, добавив индекс к уникальному идентификатору.