2011-11-02 1 views
1

성능을 향상시키려는 매우 간단한 프로그램이 있습니다. 제가 알고있는 한 가지 방법은 SSE3을 사용하는 것입니다 (SSE3를 지원하는 컴퓨터가 지원되기 때문에).하지만 어떻게해야하는지 전혀 모릅니다. 다음은 코드 (C++)입니다 :Really basic SSE

int sum1, sum2, sum3, sum4; 
for (int i=0; i<length; i+=4) { 
    for (int j=0; j<length; j+=4) { 
    sum1 = sum1 + input->value[i][j]; 
    sum2 = sum2 + input->value[i+1][j+1]; 
    sum3 = sum3 + input->value[i+2][j+3]; 
    sum4 = sum4 + input->value[i+3][j+4];  
    { 
} 

내가 이것에 대해 조금 읽고, 생각을 이해했습니다,하지만 난이 구현하는 방법을 전혀 생각이 없다. 누군가 제발 나를 도와 줄 수 있니? 나는이 프로그램이 매우 간단하다고 생각합니다. 특히 간단한 프로그램을 생각하면, 때로는 시작하는 것이 가장 힘든 부분입니다.

감사합니다.

답변

6

사실, 귀하의 경우에는 그렇게 간단하지 않습니다. 지금 당장은 코드가 이 아니며 벡터화가 가능합니다. (적어도 중요한 루프 변환이없는 경우)

내부 루프 내부에서 인덱스 i을 변경하려고했기 때문입니다. 메모리 위치가 더 이상 인접하지 않고 행렬의 다른 행에 있기 때문에 j 반복을 벡터화 할 수있는 기회가 없습니다. (매트릭스를 대각선으로 돌리고있는 것처럼 보임)

그러나 매트릭스의 모든 요소를 ​​합산하려고한다는 느낌이 들었고 실제로 루프가 이와 같았습니다. 많은 오타도 있습니다.) :

int sum1 = 0, sum2 = 0, sum3 = 0, sum4 = 0; 
for (int i=0; i<length; i++) { 
    for (int j=0; j<length; j+=4) { 
    sum1 = sum1 + input->value[i][j]; 
    sum2 = sum2 + input->value[i][j+1]; 
    sum3 = sum3 + input->value[i][j+2]; 
    sum4 = sum4 + input->value[i][j+3];  
    } 
} 

int total = sum1 + sum2 + sum3 + sum4; 

이것이 원하는 경우라면 매우 벡터화 할 수 있습니다. 단지 SSE2를 사용하여 다음과 같이 C에서 은/내장 함수를 사용하여 C++는,이 수행 할 수 있습니다 : 정렬 제한이 적용됩니다

__m128i sum = _mm_setzero_si128(); 
for (int i=0; i<length; i++) { 
    for (int j=0; j<length; j+=4) { 
    __m128i val = _mm_load_si128(&input->value[i][j]); 
    sum = _mm_add_epi32(sum,val); 
    } 
} 

참고. 또한 루프를 풀면 훨씬 더 빠른 속도 향상을 얻을 수 있습니다.