2014-09-26 83 views
0

我一直試圖在一個系統上測試我的複雜CSR矩陣矢量代碼,每個系統有2個CPU,每個6個核心。我驚奇地發現1,2,4,6或12線程的時間幾乎相同。它的工作原理,我可以看到相應的線程在乘法運算期間仍然存在,但沒有加速。我不明白我是否犯了一些錯誤,或者只是說現在的問題不能縮放。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); 

}

我避開0.38秒,奔跑與1,2,4,6,8,12個線程,我不明白爲什麼我沒有看到,甚至10%的速度提升。

感謝您提前提出任何意見。

+0

所有線程是否同時運行?如果程序利用多核CPU,我會調用omp_get_num_threads()函數來查明實際情況。 – Juniar 2014-09-26 18:49:54

+1

最近一個問題的重複可能是一個問題的重複[是一個老問題]的副本(http://stackoverflow.com/questions/10673732/openmp-time-and-clock-calculates-two-different - 結果) - 不要使用clock()。此外,你的代碼是內存限制的,而且大矩陣的性能不會擴展。 – 2014-09-26 18:52:35

+0

@Hristo Iliev可能,但它是由不同的用戶問的。但是,您可能必須重定向他,以確定他是否在問他是什麼。 – Juniar 2014-09-26 18:59:06

回答

1

看起來減少變量rowSum正在成爲一個序列化點。由於rowSum不僅累計爲總數,而且還從(y [offset + i] = rowSum;中讀取),因此它必須被序列化。

如果您打算讓rowSum僅跨過一行,我將刪除該縮減並將其設爲私有。我想改變編譯到:

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

如果您打算爲rowSum能夠跨所有行總,我會用我的上述建議,獲取並行,然後用一個前綴和修改Ÿ事後得到正確的總數。