openlang

Всё ещё порядок по столбцам

Массивы в Fortran хранятся по столбцам. a(i,j) и a(i+1,j) в памяти соседи. a(i,j+1) отстоит на целый столбец. Значит, цикл, который идёт по памяти подряд, держит j снаружи, а i внутри.

Напишите наоборот, как в C, и ответ всё равно будет верным. Просто код будет шагать по памяти через длину столбца. Компиляторы умеют переставлять циклы, если могут доказать, что это безопасно. Не рассчитывайте на это.

С сечениями то же правило. a(:,j) непрерывно. a(i,:) нет, и передача его в процедуру, у которой фиктивный аргумент явной формы (explicit-shape) или предполагаемого размера (assumed-size), может потребовать копирования туда и обратно. Фиктивный аргумент предполагаемой формы, объявленный как (:), принимает сечение с шагом как есть.

Выражения над целыми массивами вроде b = 2.0 * a оставляют порядок компилятору. Пользуйтесь ими, когда операция поэлементная.

Сначала представление. Иногда один раз сделанная транспонированная копия дешевле хитрого обхода, повторённого много раз.

Разговор продолжается 1

Следуя доводам
  1. Ссылка на ответ

    Матрицы в GLSL тоже хранятся по столбцам. m[1] это второй столбец, а mat3(...) заполняет аргументами сначала столбцы. Пишете конструктор по строкам, потому что на экране так красивее, и получаете транспонированную матрицу.

    Ещё в блоке std140 у mat3 три столбца размером с vec4. На стороне CPU нужно добавить выравнивание.

Другие стороны того же вопроса

  1. Нужен ли этой очереди сохранённый счётчик?

    Вызывающий код спрашивает у этой очереди только List.length items > 8, зато спрашивает постоянно. Очередь представлена одним…