我正在尝试使用 open mp 加速稀疏矩阵向量乘积,代码如下:
void zAx(double * z, double * data, long * colind, long * row_ptr, double * x, int M){
long i, j, ckey;
int chunk = 1000;
//int * counts[8]={0};
#pragma omp parallel num_threads(8)
{
#pragma omp for private(ckey,j,i) schedule(static,chunk)
for (i=0; i<M; i++ ){
z[i]=0;
for (ckey=row_ptr[i]; ckey<row_ptr[i+1]; ckey++) {
j = colind[ckey];
z[i] += data[ckey]*x[j];
}
}
}
}
现在,这段代码运行良好,并产生了正确的结果,但是它只给了我大约 30% 的速度。我检查过线程都获得了相同数量的非零元素(它们是),并且矩阵相当大(300,000 x 300,000),所以我希望开销不是唯一的问题. 我也尝试过使用不同的块大小和线程数运行,我得到了类似的性能。
还有什么我可以尝试从中获得额外速度的东西吗?或者我显然做错了什么?
干杯。
编辑:刚刚注释掉'//int * counts [8] = {0}',因为它是计算工作分配的剩余部分。没有必要
编辑2(更多细节):
好的,所以我计时了一个调用这个 5000 次的循环并得到了平均时间:
- seq:0.0036(秒?)
- 2 个线程:0.002613
- 4 线程:0.002308
- 8 个线程:0.002384
该矩阵的大小为:303544x303544,并具有:2122980个非零元素。
使用更小的矩阵 30000x30000 我得到的时间更像
- 序列号 0.000303
- 8 线程 0.000078
所以看起来大尺寸可能是我的问题。