Armadillo中OpenMP的性能问题:.each_slice()和.for_each()

时间:2018-08-29 17:07:22

标签: c++ multithreading openmp armadillo

我目前正在一个项目中,该项目涉及对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的布尔变量。

0 个答案:

没有答案