2014-09-26 3 views
0

6 개의 코어가있는 2 개의 CPU가있는 시스템에서 복잡한 CSR 매트릭스 벡터 코드를 테스트하려고했습니다. 놀랍게도 1, 2, 4, 6 또는 12 스레드에 대해 거의 동일한 타이밍을 얻습니다. 그것은 작동하고 해당 스레드가 곱셈 중에 살아 있지만 속도가 올라가지 않는 것을 볼 수 있습니다. 내가 실수를 저 지르거나 바로 옆에있는 문제를 확장 할 수 없다는 것을 이해하지 못합니다. 심지어 10 %의 속도 향상을 확인할 수 없습니다있는 이유OpenMP 성능 없음 : 중첩 루프

void spmv_csr(int num_rows, const int* rowPtrs, const int* colIdxs, const double complex* values, const double complex* x, double complex* y) 
{ 
    double complex rowSum; 
    int i, j, row_start, row_end; 
    clock_t begin, end; 
    begin = clock(); 
    #pragma omp parallel for private(j, i, row_start, row_end) reduction(+:rowSum) 
    for(i = 0; i < num_rows; i++) 
    { 
    rowSum = 0.00 + 0.00 *I; 
    row_start = rowPtrs[i]-1; 
    row_end = rowPtrs[i+1]-1; 
    for (j=row_start; j<row_end; j++) 
    { 
     rowSum += ((creal(values[j]) * creal(x[colIdxs[j]-1])) - (cimag(values[j]) * cimag(x[colIdxs[j]-1]))) + (((creal(values[j]) * cimag(x[colIdxs[j]-1])) + (cimag(values[j]) * creal(x[colIdxs[j]-1]))) * I); 
    } 
    y[offset+i] = rowSum; 
    } 
    end = clock(); 
    printf("Time Elapsed: %f seconds\n", (double)(end - begin)/CLOCKS_PER_SEC); 

}

나는 1, 2, 4, 6, 8, 12 개 스레드, 이해가 안와 실행 주변에 0.38 초 얻을.

미리 알려 주셔서 감사합니다.

+0

모든 스레드가 동시에 실행되고 있습니까? omp_get_num_threads() 함수를 호출하여 프로그램이 멀티 코어 CPU를 활용하는지 실제로 확인합니다. – Juniar

+1

[이전 질문]의 사본 인 질문의 중복 인 최근 질문의 가능한 복제본 (http://stackoverflow.com/questions/10673732/openmp-time-and-clock-calculates-two-different -results) -'clock()'을 사용하지 마십시오. 또한 코드가 메모리에 바인딩되어 있으며 큰 행렬 성능으로 인해 확장되지 않습니다. –

+0

@Hristo Iliev 가능하지만 다른 사용자가 요청했습니다. 그러나 그가 물어보고있는 것인지 알아 내기 위해 리디렉션해야 할 수도 있습니다. – Juniar

답변

1

줄이기 변수 rowSum이 직렬화 지점이되었습니다. rowSum은 총계로 누적 될뿐만 아니라 (y [offset + i] = rowSum;에서 읽혀지기 때문에) 직렬화되어야합니다.

rowSum이 하나의 행에 걸쳐있는 경우, 감소를 제거하고 비공개로 만듭니다. 내가 병렬 처리를 얻을 내 위의 제안을 사용,

#pragma omp parallel for private(j, i, row_start, row_end, rowSum) 

rowSum이 모든 행에 걸쳐 총으로 당신이하려는 경우, 다음 얻을 후 Y를 수정하는 접두사-합계를 사용 : 나는 프라 그마에 변경 것 정확한 합계.