2014-09-26 80 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能够跨所有行总,我会用我的上述建议,获取并行,然后用一个前缀和修改Ÿ事后得到正确的总数。