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%的速度提升。
感谢您提前提出任何意见。
所有线程是否同时运行?如果程序利用多核CPU,我会调用omp_get_num_threads()函数来查明实际情况。 – Juniar 2014-09-26 18:49:54
最近一个问题的重复可能是一个问题的重复[是一个老问题]的副本(http://stackoverflow.com/questions/10673732/openmp-time-and-clock-calculates-two-different - 结果) - 不要使用clock()。此外,你的代码是内存限制的,而且大矩阵的性能不会扩展。 – 2014-09-26 18:52:35
@Hristo Iliev可能,但它是由不同的用户问的。但是,您可能必须重定向他,以确定他是否在问他是什么。 – Juniar 2014-09-26 18:59:06