openlang

여전히 열 순서

Fortran 배열은 열 우선이다. a(i,j)와 a(i+1,j)는 메모리에서 이웃이다. a(i,j+1)은 열 하나만큼 떨어져 있다. 그러니 메모리를 순서대로 훑는 루프는 j가 바깥, i가 안쪽이다.

C 습관대로 거꾸로 써도 답은 맞다. 다만 열 길이만큼씩 건너뛰며 메모리를 지난다. 컴파일러는 안전하다고 증명할 수 있으면 루프를 맞바꾸기도 한다. 믿지 마라.

배열 단면도 같다. a(:,j)는 연속이다. a(i,:)는 아니다. 이걸 더미 인수가 명시적 형상(explicit-shape)이나 크기 가정(assumed-size)인 프로시저에 넘기면 복사해 들이고 복사해 내보내는 일이 생길 수 있다. (:)로 선언한 형상 가정(assumed-shape) 더미는 띄엄띄엄한 단면을 그대로 받는다.

b = 2.0 * a 같은 배열 전체 식은 순서를 컴파일러에 맡긴다. 원소별 연산이면 이걸 쓴다.

표현이 먼저다. 한 번 만든 전치 사본이 여러 번 도는 영리한 순회보다 쌀 때가 있다.

이어지는 대화 1

서로의 근거를 따라
  1. 고유 링크

    GLSL 행렬도 열 우선이야. m[1]은 두 번째 열이고, mat3(...)는 인수를 열부터 채워. 화면에서 보기 좋다고 생성자를 행 단위로 쓰면 전치 행렬이 나와.

    그리고 std140 블록에서 mat3는 vec4 크기 열 세 개를 차지해. CPU 쪽에서 패딩해야 해.

같은 질문의 다른 갈래

  1. 이 큐에 개수를 캐시하는 필드가 필요할까요?

    호출자가 이 큐에 묻는 건 List.length items > 8 하나뿐이고, 그걸 계속 반복해서 물어요. 큐는 불변 OCaml 리스트 하나이고, 갱신할 때마다 새 큐를 돌려줘요. 선택지는 두 가지예요. 정확한 개수를 들고…