2011-07-25 2 views
0

간단한 할당을 반복하는 데 약 50 배의 시간이 소요됩니다. 나의 첫 번째 반응은 배열에서 내 메모리 접근을 방해하여 캐시 미스가 발생했다는 것입니다. 그러나이 경우에는 보이지 않습니다.배열을 통한 단순 루프의 경우 메모리 액세스가 매우 느림

픽셀 값 할당 및 배열 업데이트에는 강아지 나이가 필요합니다. 여러분 중 누구라도 이런 일이 일어나는 이유에 관해서는 성향이 있습니까? 당신은 항상 사실이 있는지 확인하고,

memset(columnSumsCurrentFrameA, 0, sizeof(unsigned int) * (_validImageWidth/numSubdivisions)); 
memset(rowSumsCurrentFrameA, 0, sizeof(unsigned int) * (_validImageHeight/numSubdivisions)); 

int pixelValue = 0; 
int startingRow = 0; 
int startingColumn = 0; 

for (int i = 0; i < _validImageHeight/numSubdivisions; i++) 
{ 
    int index = (i + startingRow) * _imageWidth; 
    for(int j = 0; j < (_validImageWidth/numSubdivisions); j++) 
    { 
     pixelValue = imageData[index + startingColumn + j]; 
     columnSumsCurrentFrameA[j] += pixelValue;   
     rowSumsCurrentFrameA[i] += pixelValue;    
    } 
} 
+0

예상 한 시간이 예상보다 50 배 길다는 것을 어떻게 알 수 있습니까? 여기에 귀하의 목록에 타이밍 코드가 없습니다. 비트 맵을 표시하려고하면 픽셀 쓰기보다 속도가 느립니다. – hotpaw2

+0

어때요? –

+0

도움을 주셔서 감사합니다. 내 문제에 관해서는, 내가 문제라고 생각하는 것을 발견했다. 내 픽셀 값이 메인 시스템 메모리에있는 것처럼 보이게 만들었지 만, 그 값은 GPU 전용 메모리 섹션에 저장되어있는 것 같습니다. 그래서 GPU에서 데이터를 효과적으로 요청하고있었습니다. 높은 지연 시간 작동. 이전 메모리 공간의 모든 데이터에 대해 단일 memcpy를 수행하여 malloc'd 섹션으로이 효과를 완화했습니다. 이것은 나의 공연을 두 배로했다. 애플은 그런 문제에 관한 책이 아니기 때문에 확신 할 수는 없지만 이것이 문제라고 확신한다. – Aerospyke

답변

0

_validImageWidth/numSubdivisions의 결과는 정수 여야합니다 (I는 A4와 아이팟 용으로 컴파일하고)?

또한 이중 루프를 입력하기 전에 _validImageWidth/numSubdivisions을 계산해야합니다. 컴파일러가 처리한다고 가정하는 것이 안전하지 않습니다.

int limit = _validImageHeight/numSubdivisions; 

for (int i = 0; i < limit; i++) 
{ 
     int index = (i + startingRow) * _imageWidth; 
     for(int j = 0; j < limit; j++) 
     { 
      pixelValue = imageData[index + startingColumn + j]; 
      columnSumsCurrentFrameA[j] += pixelValue;   
      rowSumsCurrentFrameA[i] += pixelValue;    
     } 
}