메모리에 대한 액세스와 관련하여 매우 이상한 성능 문제가 있습니다. 코드 조각은 다음과 같습니다왜 메모리 액세스가 너무 느린가요?
#include <vector>
using namespace std;
vector<int> arrx(M,-1);
vector< vector<int> > arr(N,arrx);
...
for(i=0;i<N;i++){
for(j=0;j<M;j++){
//>>>>>>>>>>>> Part 1 <<<<<<<<<<<<<<
// Simple arithmetic operations
int n1 = 1 + 2; // does not matter what (actually more complicated)
// Integer assignment, without access to array
int n2 = n1;
//>>>>>>>>>>>> Part 2 <<<<<<<<<<<<<<
// This turns out to be most expensive part
arr[i][j] = n1;
}
}
N과 M - 10000 정도 - 1000의 순서의 일부 상수이다. 이 코드 (릴리스 버전)를 컴파일 할 때 파트 2에 주석이 달린 경우 약 15 클럭 걸립니다. 이 부분에서 실행 시간은 100+ 클럭까지 올라서 거의 10 배 더 느려집니다. 나는 할당 연산이 단순한 산술 연산보다 훨씬 저렴할 것으로 기대했다. 배열을 사용하지 않는다면 실제로 적용됩니다. 그러나이 배열을 사용하면 훨씬 많은 비용이들 것입니다. 2 차원 대신 1 차원 배열을 시도했습니다. 동일한 결과 (2D의 경우 분명히 느립니다). 벡터 < 벡터 < int>> 대신 int ** 또는 int *를 사용하거나 벡터 < int>를 사용합니다. 다시 결과가 동일합니다.
배열 할당시 성능이 저하되는 이유는 무엇입니까?
편집 : 한 번 더 관찰 : 주어진 코드의 2 부에서 우리는 (의견의 숫자)
n1 = arr[i][j]; // 16 clocks
속도에
arr[i][j] = n1; // 172 clocks
에서 할당을 변경하면 올라갑니다. 우리가 라인을 변경하는 경우 더 흥미롭게 :
arr[i][j] = n1; // 172 clocks
arr[i][j] = arr[i][j] * arr[i][j]; // 110 clocks
에가 속도가 읽기에 어떤 차이가 있나요 및 /에서 메모리에 쓰는 간단한 과제 보다도 더 높다? 왜 이상한 성능을 얻습니까?
미리 감사드립니다.
그건 단지 과제 이상입니다 ... – AJG85
중첩 된'vector' 대신에 flat 배열을 사용하면 더 나은 결과를 얻을 수 있습니다. 'boost :: multiarray'를 시도하십시오. – pmr
이고 셀을 메모리 순서대로 처리하려는 경우가 있습니다 (캐시를 더 잘 사용하는 경우). – ysdx