以下是以COO格式提供的稀疏矩阵的矩阵向量乘法的代码
for (int i=0; i<n; ++i)
y[i] = 0.0;
for (int i=0; i<nnz; ++i)
y[row[i]] += val[i]*x[col[i]];
表示由row
,col
和val
数组给出的稀疏矩阵,每个数组大小为nnz
,矩阵中非零值的数量。当我将乘法与openmp并行化时,我正在执行以下操作
#pragma omp parallel for default(shared)
for (int i=0; i<nnz; ++i)
#pragma omp atomic
y[row[i]] += val[i]*x[col[i]];
我正在使用原子构造,因为我不知道存储行和列值的顺序。因此,当y
减少时,我应该避免出现“竞争”条件的可能性。使用此代码,我可以在16个处理器(大约2.0倍)上获得微弱的加速。我有什么选择来执行这样的矩阵向量乘法与给定的COO稀疏矩阵,它提供了不错的加速?我可以避免使用原子构造吗?
谢谢