我使用 Armadillo 作为 OpenBLAS 的接口。在我当前的程序中,我有一个循环,我在其中进行形式的乘法
for(long t = t0; t < t1; t+=tStep)
{
stateMatrix %= elementWiseEvolutionMatrix;
}
该运算符%是逐元素乘法运算符。这里的问题是,对于边长为 500+ 的矩阵(我手头的矩阵),我可以看到没有任何并行化。现在我想指出,普通矩阵乘法是并行化的。但是这种逐元素乘法不是并行的。
我怎么知道?因为我进入htop我的 linux 系统,我看到只有一个核心很忙,而如果我对普通矩阵乘法做同样的事情,我看到所有核心都忙。
现在我尝试使用 OpenMP 手动并行化它,但没有运气。我试过了:
for(long t = t0; t < t1; t+=tStep)
{
#pragma omp parallel for
for(long i = 0; i < static_cast<long>(stateMatrix.n_rows); i++)
{
stat1eMatrix.row(i) %= elementWiseEvolutionMatrix.row(i);
}
}
但这让所有的核心都忙起来了,但程序变得慢了大约 10 倍。
我的问题:如何通过并行化使逐元素乘法尽可能快?
谢谢。
编辑:我想指出,如果有必要,我很乐意使用另一个库进行元素乘法。