Можете ли вы изменить способ упорядочения 2d массивов в C ++ / CUDA

Предположим, у меня есть двумерный массив в 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 расположить это в порядке столбцов?

0

Решение

Почему бы вам просто не поменять используемые вами индексы?

Вместо того, чтобы использовать arr[x][y] использование arr[y][x],

Интересно, почему вы хотели бы сделать это. Может быть, использование кеш-памяти может быть полезным, но я не могу сказать наверняка без подробностей.

Надеюсь, это поможет.

2

Другие решения

Транспонировать матрицу. arr[4][4] Значит это arr является массивом из 4 массивов размера 4. Причина для хранения значений в порядке «основной строки» заключается в том, что arr[0]например, должен дать нам указатель на первый из этих четырех массивов, а элементы одного массива должны быть размещены в смежных местах памяти, чтобы на них можно было ссылаться по отдельности, добавив индекс к уникальному идентификатору.

1