我目前正在一个项目中,该项目涉及对Armadillo Cube切片和Field的多种操作,这些操作很容易并行化。我想通过.each_slice()和.for_each()利用Armadillo中的lambda函数,并通过激活OpenMP标志来提高性能。我根本无法提升代码(请参见下面的示例),实际上激活了OpenMP却使我的模拟变慢了(在我的macOS笔记本电脑中(clang ++ -Xpreprocessor -fopenmp -lomp)和一个gcc(- fopnemp)(基于Linux的大学集群中的编译器)。
我想了解在哪些情况下建议在这些功能中使用openMP:
1)我知道只有当基础数组足够大时,多线程操作才有用。切片的数量和基础矩阵的尺寸(在多维数据集中)有多重要?考虑使用OpenMP的合理数字是多少?
2)标志ARMA_OPENMP_THREADS,ARMA_OPENMP_THRESHOLD表示按元素操作。它们对.each_slice()或.for_each()完全没有影响吗?
示例
我替换了以下循环:
for(uword j=0; j<d_in; ++j){
mycube.slice(j) = A * mycube.slice(j);
}
通过以下语句:
mycube.each_slice( [Ai_remainder] (cmat& X) {X = A*X;} ,OMPstatus);
其中A只是与基础多维数据集相同类型的矩阵,OMPstatus只是一个用于激活(停用)OpenMP的布尔变量。