인텔코어 i7 QPI에 관해서

[img:3cp6imh7]http://it.donga.com/files/2010/05/04/qpi2.jpg[/img:3cp6imh7]

인텔코어 i7 에는 메모리 콘트롤러가 CPU에 포함되었다고 들었습니다.

슬롯에 메모리 2Gb 네개가 꼽혀있습니다.
(각 메모리를 M1, M2, M3, M4라고 부르겠습니다.)
CPU는 쿼드코아입니다.
(각코어를 C1, C2, C3, C4라고 브르겠습니다.)

CPU에 메모리 콘트롤러가 들어있다는 말은
C1-M1, C2-M2, C3-M3, C4-M4 이렇게 컨트롤 한다는 뜻인가요 (1)

지금 계산을 하고 있습니다.
CPU코어는 하나만(C1) 쓰고, 메모리는 3Gb이상 필요한 계산입니다.
만일 (1)번과 같이 쌍을 이룬다면
C1-M1 과는 통신이 빨리 이루어지겠지만,
부족한 1G는 다른 메모리를 써야할텐데
이때 C1-M2(또는 M3,M4)통신은 속도가 많이 느려지게 될 것 같습니다.

실제 메모리가 2G이내인경우는 계산 크기에 비례해서 시간이 걸렸는데
3G가 넘으니 계산 크기비 보다 훨씬 시간이 더 걸리는 것 같습니다.
혹시 이와 관련해서 참고할 만한 것이 있을까요.

[b:1sgn3p0t]네할렘의 노스브릿지(메모리콘트롤러)는 코어마다 달려있는것이 아닙니당. CPU당 하나입니다.[/b:1sgn3p0t]
따라서 쿼드코어라고 해서 메모리콘트롤러가 4개는 아닙니다. 하나입니다.

이에 관한 알기 쉬운 도해는 다음 링크에서 살펴보실수 있습니다.

http://withnotebook.tistory.com/56

[img:1sgn3p0t]http://cfs6.tistory.com/upload_control/download.blog?fhandle=YmxvZzEyMDUyMUBmczYudGlzdG9yeS5jb206L2F0dGFjaC8wLzAyMDAwMDAwMDAzOS5qcGc%3D[/img:1sgn3p0t]

또한 QPI의 개념에도 약간의 말씀을 더한다면, QPI는 코어간 통신 또는 CPU간 통신에 관련된 인터페이스이며, 보통 L2 Cache, L3 Cache레벨에서의 인터페이스입니다. 메인메모리와의 통신은 여전히 FSB를 통해 이뤄지고 있습니다.

[b:1sgn3p0t]말씀하신 대용량 연산에서의 속도 적체문제의 원인으로는 다음 2가지를 생각해 볼 수 있습니다.[/b:1sgn3p0t]

[quote:1sgn3p0t]

  1. FSB 대역폭 및 DRAM메모리의 대역폭의 한계로 인한 속도적체 : 아마 현재로서는 1333Mbps일겁니다.
    메모리 대역폭과 관련하여 개선노력을 하셔야합니다.

  2. 알고리즘상의 속도 적체문제 : n by n의 행렬곱의 경우를 예로 들겠습니다.
    n이 증가하게 됨에 따라 연산속도는 로그 그래프를 그리게 됩니다.
    (바꿔말하면 n이 증가하게 됨에 따라 연산시간은 지수그래프형태를 이룹니다)

                                    따라서 처음 얼마간은 n에 따라 연산시간이 정비례하는 것처럼 보이지만, n이 증가함에 따라
                                    연산시간이 기하급수적으로 늘어난다고 해도 사실 이게 잘못된 것은 아닙니다
                                    (원래 알고리즘이 그렇게 생겨먹은 거니까요)
    
                                    이것을 해결하기 위해서는 사용하시는 알고리즘을 변경하시면 됩니다.
                                    요즘에는 여러 BLAS가 나와있으니 그 중 우수한 것을 택하시면 될겁니다. 
                                    보통 슈퍼컴퓨팅 계열에서는 ATLAS BLAS를 사용하더라구요.
                                    또 인텔에서 배포하는 BLAS를 사용하는 경우도 있습니다.
                                    (제 경우에는 연산프로그램으로 R을 쓰는데.. 그냥 R 개발자가 배포하는 blas를 그대로 쓰고있습니다)
    

[/quote:1sgn3p0t]

이럴 때는 brute force를 써 보는 것도 방법입니다. AMD 시피유를 쓰는 서버는 없나요? AMD에서 같은 연산을 돌려 보시고 어떤 특성이 나타나는지를 보시면 좀 더 충분한 데이터가 나오지 않을까 싶습니다.

어떤 계산을 하시는지는 모르겠지만 3기가 정도면 행렬 연산이 아닌가 싶네요. 행렬 연산이면 아마도 Ax=b에서 x 구하는 경우가 많을 테고… 이럴 때 조심하셔야 하는 게 (i, j) 인덱스만 바뀌어도 연산 속도가 확 차이나는 경우가 있습니다. 그러니까 A(i, j)를 A(j, i)로 바꾸었더니 계산속도가 엄청 차이가 나는 것이죠.

이유는 간단합니다. Caching이 i 먼저 되느냐 j 먼저 되느냐는 차이이죠. 아주 간단한 예로 캐쉬가 주소가 연속된 메모리 100개를 저장하는데 A(1, 1) A(2, 1) A(3, 1) … 이런 식으로 프로그램이 메모리를 쓴다고 합시다. Caching이 i 인덱스 먼저 된다면 A(1, 1) A(2, 1) A(3, 1), … 는 캐쉬 메모리에 저장이 되니 억세스가 무지 빠릅니다. 그런데 만약 Caching이 j 부터 된다면요? A(1, 1) A(1, 2) A(1, 3) 순으로 캐쉬 메모리에 저장이 되겠죠. 이렇게되면 A(2, 1), A(3, 1) 등등은 캐쉬가 아닌 일반 메모리에 저장되니 억세스가 늦어질 수 밖에 없습니다.

일단 AMD 시피유는 메모리 컨트롤러가 코어 하나마다 따로따로 존재하는 것으로 알고 있습니다. (그러니까 triple core도 가능하겠죠.) 가능하다면 일단 AMD 시피유로 테스트를 해 보시는게 어떨까 싶네요.