2014-02-26 5 views
0

나는 내가 OMP는 중첩 된 루프를 최적화 if 문

void optimized(int data_len, unsigned int * input_array, unsigned int * output_array, unsigned int * filter_list, int filter_len) { 

    #pragma omp parallel for 
    for (int j = 0; j < filter_len; j++) { 
     for (int i = 0; i < data_len; i++) { 
      if (input_array[i] == filter_list[j]) { 
       output_array[i] = filter_list[j]; 
      } 
     } 
    } 
} 

병렬

에서 실행하려고 그냥 프라 그마 문을 걸었습니다 코드 몇 줄을 다음과 같은 것은 정말 놀라운 일을했다,하지만 내가 더 줄이기 위해 노력하고 이 코드의 실행 시간 배열 패딩에서 루프를 축소하여 작업을 만드는 것에 이르기까지 많은 것을 시도했지만, 지금까지는 루프 언 롤링 만 작동하는 것으로 보입니다. 누구든지 내가이 코드를 더 빨리 할애 할 수있는 것에 대한 제안을 가지고 있습니까?

+0

어떤 컴파일러를 사용하고 있습니까? – MattG

+0

gcc with -O3 optimization –

+0

Intel 프로세서를 사용하는 경우 Intel Intrinsics : http://software.intel.com/sites/landingpage/IntrinsicsGuide/ – MattG

답변

0

순수 메모리 액세스를 수행하고 있습니다. 이는 기계의 메모리 대역폭에 의해 제한됩니다. 멀티 스레딩이 도움이되지 않습니다. gcc -O2는 이미 SSE 명령어 최적화를 제공합니다. 따라서 인텔 지침을 직접 사용하는 것은 도움이되지 않을 수 있습니다. SSE 지원 128 레지스터 (일부 예제에서는 https://gcc.gnu.org/onlinedocs/gcc-4.4.5/gcc/X86-Built_002din-Functions.html 및 google을 참조하십시오) 또한 int 대신 short를 사용하여 데이터 양을 줄이는 것이 가능하기 때문에 한 번에 4 int를 확인하려고 할 수 있습니다.

+0

메모리 참조의 자연적인 크기 (일반적으로 32 비트는 하루)는 32 비트가 한 번에 이동되기 때문에 int를 사용하는 것이 더 빠를 것입니다. – user3629249

+0

당신은 CPU의 노력을 다루고 있습니다. 그러나 그의 경우 메모리 액세스 시간이 지배적입니다. 따라서 제 경험은 작은 데이터가 도움이된다는 것입니다. – moonshade0227