배열(Array)란?

같은 형의 값을 나란히 기억하고, 인덱스(첨자)로 개별 요소를 지정하는 데이터 구조. 메모리상에 연속으로 놓이므로 인덱스로부터 위치를 계산하여 어느 요소든 일정한 시간에 읽고 쓸 수 있다. 인덱스가 0부터 시작하는 언어와 1부터 시작하는 작성법이 있다.

일본어 명칭: 配列

배열(Array)은(는) 프로그래밍의 기초(의사 코드 트레이스), 자료 구조와 알고리즘, GPU 프로그래밍 등 15개 분야의 연습 문제 73개에 나와요.

분야: 프로그래밍의 기초(의사 코드 트레이스)

도전해 보기: 배열(Array) 관련 문제

다이렉트 매핑 방식 캐시에서 두 배열의 요소가 같은 캐시 위치에 대응하여, 번갈아 접근할 때마다 서로를 쫓아내고 있다. 이 미스의 분류는?

  1. A초기 참조 미스
  2. B용량 미스
  3. C충돌 미스
정답과 해설 보기

정답: C. 충돌 미스

캐시 전체에는 여유가 있는데도 두 데이터가 같은 세트를 두고 다투며 서로 쫓아내는 미스는 충돌 미스입니다. 연관도를 높여 같은 세트에 둘 이상 둘 수 있게 하거나, 배열의 시작 위치를 어긋나게 하여 다른 세트에 대응시키면 줄일 수 있습니다. 용량 미스는 워킹 세트가 캐시 전체보다 큰 것이 원인이며 풀 어소시에이티브로 해도 줄지 않습니다. 초기 참조 미스는 처음 접근할 때 일어나는 것으로, 반복 접근에는 해당하지 않습니다.

2차원 배열의 한 행 크기가 4096바이트(2의 거듭제곱)일 때, 열 방향으로 요소를 따라가면 캐시 용량에 여유가 있어도 미스가 많아지는 경우가 있다. 그 대책으로 효과가 있는 것은?

  1. A각 행의 끝에 패딩을 추가하여 행 크기를 2의 거듭제곱에서 어긋나게 한다
  2. B배열의 타입을 같은 크기의 다른 타입으로 바꾼다
  3. C배열 전체를 큰 2의 거듭제곱 주소 경계에 맞추어 다시 배치한다
정답과 해설 보기

정답: A. 각 행의 끝에 패딩을 추가하여 행 크기를 2의 거듭제곱에서 어긋나게 한다

한 행이 정확히 4096바이트이면 열 방향으로 따라가는 요소의 주소는 모두 4096의 배수씩 떨어져 인덱스 중 하위 12비트에 포함되는 부분이 같아지고 극히 적은 수의 세트에 집중됩니다(1웨이가 4 KB 이하인 L1 캐시라면 모두 같은 세트입니다). 같은 세트에 연관도보다 많은 행이 모이면 용량에 여유가 있어도 서로 쫓아내는 충돌 미스가 일어납니다. 각 행에 1라인 분 정도의 패딩을 추가하면 요소마다 대응하는 세트가 어긋나 분산됩니다. 2의 거듭제곱 주소에 맞추어도 문제는 변하지 않으며, 같은 크기의 타입으로 바꿔도 효과가 없습니다.

해설 속 배열(Array)

배열(Array)이(가) 나오는 문제 (73)

  1. a0에 int형(4바이트) 배열 a의 시작 주소, a1에 첨자 i가 들어 있다. 위의 코드가 a2에 읽어 들이는 것으로 올바른 것은?
  2. C 언어의 2차원 배열 a[i][j]를 위와 같이 안쪽 루프를 j로 하여 순회하면, 안쪽을 i로 하는 것보다 빨라지기 쉽다. 그 이유는?
  3. 다이렉트 매핑 방식 캐시에서 두 배열의 요소가 같은 캐시 위치에 대응하여, 번갈아 접근할 때마다 서로를 쫓아내고 있다. 이 미스의 분류는?
  4. 위 루프에서 int가 4바이트, 캐시 라인이 64바이트이고, 배열은 캐시에 들어 있지 않으며 시작 주소가 라인 경계에 정렬되어 있을 때, 프리페치가 없다면 배열 읽기의 미스율은 얼마인가?
  5. 위와 같이 x 좌표만 합산하는 처리를 배열의 구조체(각 성분을 별도의 배열로 만드는 형태)로 바꾸면 빨라지기 쉬운 이유는?
  6. 2차원 배열의 한 행 크기가 4096바이트(2의 거듭제곱)일 때, 열 방향으로 요소를 따라가면 캐시 용량에 여유가 있어도 미스가 많아지는 경우가 있다. 그 대책으로 효과가 있는 것은?
  7. 위 연결 리스트를 따라가는 처리가 같은 수의 요소를 가진 배열을 차례로 읽는 것보다 크게 느려지기 쉬운 이유는?
  8. 스레드별 카운터를 'long cnt[8];'처럼 늘어놓은 배열에서 거짓 공유가 일어나고 있다. 대책으로 가장 적절한 것은 무엇입니까?
  9. 배열의 모든 요소의 합계를 여러 스레드로 구할 때, 성능을 위해 적합한 방법은 무엇입니까?
  10. 요소 수 1000인 배열을 블록당 256스레드, 스레드당 1요소씩 처리하려 한다. 실행할 블록 수로 올바른 것은?
  11. 각 스레드의 번호를 i로 하여, 위와 같이 32요소 간격으로 배열을 읽으면 a[i]를 읽는 경우보다 느려진다. 주된 이유는?
  12. 배열 요소를 한 번만 더하는 가벼운 처리를 위해 데이터를 GPU로 보내면 CPU에서 계산하는 것보다 느려지는 경우가 있다. 주된 이유는?
  13. GPU에서 두 개의 큰 배열의 요소별 덧셈(c[i] = a[i] + b[i])을 수행할 때, 성능을 주로 결정하는 것은?
  14. GPU에서 조건에 맞는 요소만 배열에서 골라 다른 배열에 채워 넣어 출력하고 싶다(각 스레드의 출력 수는 0 또는 1). 각 스레드의 쓰기 위치 주소를 정하는 데 자주 사용되는 병렬 계산은?
  15. 원소 수가 n인 배열에서 서로 다른 두 원소의 쌍을 모두 한 번씩 비교하는 처리(i번째 원소를 그보다 뒤에 있는 모든 원소와 비교하는 것을, i를 하나씩 늘려 가며 반복하는 이중 루프)의 시간 복잡도는?

관련 용어

변수(Variable) 포인터(Pointer) 캐시 라인(Cache Line) 연결 리스트(Linked List) GPU 스택(Stack) 프리페치(Prefetch) 구조체(struct) SIMD 시간 복잡도(Time Complexity)

용어집으로 돌아가기