使用 Open MP 并行"for"循环读取和写入数据结构
Parallelise 'for' loop reading and writing to data structure with Open MP
我正在使用C++创建一个有限元分析例程,并尝试使用Open MP来并行我的代码中的一些"for"循环。
我有一个名为Elements的结构数组,数组的每个部分都包含一个结构,其中包含该特定元素的所有信息。所需的一些信息是每个元件的刚度矩阵(在下面的代码中称为kt(。然后将其组装成整个系统的全局刚度矩阵。
单元刚度矩阵的计算非常复杂和冗长,所以我认为通过并行计算可以获得一些很好的速度增益。
以下代码在与Open MP相关的所有内容都被注释掉时工作良好,但在没有注释掉时失败,尽管我没有同时写入Elements,并且kt和Elementsi(第I个元素(对它们所使用的线程是私有的。
我在矩阵代数中使用Armadillo,这就是"mat"的意思。
我是C++的新手,所以任何帮助都将不胜感激。
mat KtCalc(struct Element Elements[],mat Nodes,double ngamma,double nbeta,double hhtalpha, int nel, double dt)
//Stiffness matrix calculation routine
{
int nn=Nodes.n_rows;
mat Kt(nn*6, nn*6, fill::zeros);
int i;
struct Element Elementi;
mat kt;
#pragma omp parallel private(Elementi,kt) shared(nel,i,hhtalpha,ngamma,nbeta,dt,Elements)
{
#pragma omp for
for(i=0;i<nel;i++)
{
#pragma omp critical(dataupdate)
{
Elementi=Elements[i];
}
kt=KtEl(Elementi, ngamma, nbeta, hhtalpha, dt);
#pragma omp critical(dataupdate)
{
Elements[i].kt=kt;
}
}
}
for(int k=0;k<nel;k++){
//Use the stuff calculated above in a non parallel way to calculate Kt
}
return Kt;
}
您的问题是forloop的i
的共享减速。在cpp中,您可以在任何位置声明变量。以下代码是等效的,应该可以工作:
mat KtCalc(struct Element Elements[],mat Nodes,double ngamma,double nbeta,double hhtalpha, int nel, double dt)
//Stiffness matrix calculation routine
{
int nn=Nodes.n_rows;
mat Kt(nn*6, nn*6, fill::zeros);
#pragma omp parallel for
for(int i=0;i<nel;i++)
{
Elements[i].kt=KtEl(Elements[i], ngamma, nbeta, hhtalpha, dt);
}
for(int k=0;k<nel;k++){
//Use the stuff calculated above in a non parallel way to calculate Kt
}
return Kt;
}
此外,您可以同时修改数组的元素,只要您确信从未修改过同一个元素(这种情况下,您只接触第i
个元素(。因此critical
部分是不必要的。
附带说明一下,您通常希望尽可能晚地声明变量。在顶部声明它们是旧的c风格。尽可能晚地宣布它们意味着:
- 它使RAII(资源获取即初始化(变得更容易
- 它使变量的范围保持紧密。这样可以使优化器更好地工作
相关文章:
- 链表,反向函数,数据结构
- 使用文件和结构读取数据并输出数据
- 用于读取C 中的CSV的数据结构
- C 如何将数据文件读取到结构或向量以及返回结构或向量
- 如何从数据文件读取到向量的结构
- C++ 从文本文件数据类型读取为结构,并将数据存储在列表的向量中
- 如何将信息从二进制数据文件读取到结构c 的数组中
- 将内存映射的数据块读取到结构中
- 我可以读取输入数据并创建广义C++数据结构吗?
- 在 c++ 中使用消息结构读取/填充数据缓冲区的正确方法是什么?
- 难以读取的armadillo字段数据结构
- 我什么时候需要一个无锁的数据结构来跨音频应用程序中的线程读取/写入数据
- 读取大部分数据结构以压缩和搜索源代码
- 一种单一的数据结构,用于从脚本中读取任意类型的变量,以便在运行时进行检索和编辑
- 从CArchive保存的二进制数据中读取结构数组
- c++中顺序插入/读取/删除最快的数据结构是什么?
- 在使用数据结构从文件中读取数据时遇到麻烦
- 使用 Open MP 并行"for"循环读取和写入数据结构
- 从搅拌机的特定内存位置读取数据(结构)
- 大数据文件:读取并创建结构化文件