2014-10-23 1 views
1

인텔 제온 피 아키텍처에서 작동하는 간단한 매트릭스 곱셈 절차를 만들고 있습니다.이 절차는 다음과 같습니다 (매개 변수는 A, B, C). 타이밍에는 다음과 같은 내용이 포함되어 있지 않습니다. 초기화 :인텔 제온 파이에서 동적 메모리 속도가 느려짐

//start timing 
for(int i = 0; i < size; i++){ 
    for(int k = 0; k < size; k++) { 
     register TYPE aik = A[i][k]; 
     for(int j = 0; j < size; j++) { 
       C[i][j] += aik * B[k][j]; 
     } 
    } 
} 
//end timing 

제한된 데이터 정렬 등을 사용하고 있습니다. 그러나 행렬이 동적 메모리 (posix_memalign)를 사용하여 할당 된 경우 계산은 TYPE = float에 대해 심각한 속도 저하가 발생하며 512x512 행렬은 동적 경우에는 ~ 0.55s를 사용하고 다른 경우에는 ~ 0.25를 사용합니다. 다른 아키텍처 (Intel Xeon E5)에서는 느려지 기는하지만 거의 눈에 띄지 않습니다 (약 0.002 초).

도움이 필요합니다.

+0

이 모든 배열의 크기는 어떻게됩니까? 어쩌면 캐시 또는 캐시 라인에 모두 들어 맞지 않을 수 있습니까? 두 개의 외부 루프를 전환 해 보셨습니까? –

+2

또한 ['register' 저장소 지정자] (http://en.cppreference.com/w/cpp/language/storage_duration)는 더 이상 사용되지 않습니다. –

+2

빠른 매트릭스 곱셈을하고 싶다면 BLAS 라이브러리를 직접 코딩하지 말고 (힌트 : 순진 알고리즘이 이것을 수행하는 가장 빠른 방법은 아닙니다!). Intel이 제온 파이를 위해 고도로 조정 된 것을 가지고 있다고 확신합니다. –

답변

1

매트릭스를 다른 크기로 만들면 어떤 타이밍 차이가 발생합니까? (예 : 513x513)

내가 물어 보는 이유는 캐시 방식 결합을 초과하고 L2에서 C [i] []의 요소를 추방하여이 효과를 볼 수 있다고 생각합니다. . B와 C가 정렬되고 크기가 2의 제곱이면이 문제를 일으키는 캐시 수퍼 정렬이 발생할 수 있습니다.

B와 C가 스택에 있거나 정렬되지 않은 경우, 2 개의 제곱의 힘이 적어 지므로이 효과가 표시되지 않습니다.

0

"동적이지 않은"경우 배열은 전역 변수입니까? 그렇다면 BSS로 끝나고 ELF가로드되면 OS는 기본값으로 0으로 초기화합니다. 이것이 바로 BSS의 작동 방식입니다. 사용하는 방법 (예 : malloc, new, posix_memalign, 예외는 mmap (MAP_POPULATE)과 상관없이 동적으로 할당 한 경우 메모리를 터치하면 OS에 오류가 발생합니다. 오류 처리는 항상 비쌉니다. Coprocessor는 단일 스레드 성능 관점에서 작은 코어로 실행되기 때문에 상대적으로 비용이 많이 듭니다.

관련 문제