OpenMP 在使用犰狳的代码中生成段错误
OpenMP generates segfault in a code that uses Armadillo
首先,我对OpenMP不是很熟悉。我想使用 OpenMP 减少我的 C++ 代码的执行时间,这涉及数百次矩阵对角化的迭代。我并没有试图平行每个对角线化(根据犰狳的文档,可以通过强迫犰狳使用 OpenBLAS 库来实现);相反,我想在 8 核机器上的线程之间分配负载。
访问内存似乎存在问题,因为我遇到"分段错误"。我想知道是我做得不对,还是问题是由于犰狳创建和操作矩阵的方式造成的。
这是一个最小的代码,它抓住了我一直遇到的问题的本质。这个想法是对角化,比如说,1000 个 100x100 矩阵,并将其特征值存储在一个文件中。
#include<iostream>
#include<armadillo>
#include <fstream>
#include<omp.h>
int main()
{
std::ofstream File;
File.open("./RESULTS.dat");
arma::mat M; //THE MATRIX TO BE DIAGONALIZED
arma::mat Eigenvecs; //EIGENVECTORS
arma::vec Eigenval; //EIGENVALUES
arma::mat RESULTS; //STORING EIGENVALUES TEMPORARILY
//DISTRIBUTING THE ITTERATIONS AMONG CORES USING OpenMP
#pragma omp parallel shared(RESULTS) private(M,Eigenvecs,Eigenval)
{
#pragma omp parallel for ordered schedule(guided)
for( int i = 0 ; i < 1000; i++ )
{
M = arma::randu<arma::mat>(200,200); //CREATING A RANDOM MATRIX
M = 0.5*(M + M.t() ); //TO GUARANTEE THAT THE M IS NORMAL
arma::eig_sym( Eigenval , Eigenvecs , M ); //DIAGONALIZING "M"
RESULTS = arma::join_vert(RESULTS,Eigenval.t()); //CONCATENATING EIGENVALUES TO THE MATRIX "RESULTS"
}
}
File << RESULTS; //WRITING "RESULTS" TO THE FILE
File.close();
return 0;
}
当我运行此代码时,似乎负载已正确分配(我使用 htop 来监视机器上的内核),但最后我得到"分段错误"。
我想
我想通了,尽管我不知道为什么这可以解决问题。以下是修改后的代码:
#include<iostream>
#include<ctime>
#include<armadillo>
#include <fstream>
#include<omp.h>
int main()
{
std::ofstream File;
File.open("./RESULTS.dat");
arma::mat M;
arma::mat RESULTS;
arma::mat Eigenvecs;
arma::vec Eigenval;
int i,tid=0;
//DISTRIBUTING THE ITTERATIONS AMONG CORES USING OpenMP
#pragma omp parallel for ordered schedule(guided) shared(RESULTS) private(M,Eigenvecs,Eigenval,tid)
for(i = 0 ; i < 10; i++ )
{
tid = omp_get_thread_num();
M = arma::randu<arma::mat>(400,400);
M = 0.5*(M + M.t() );
//std::cout << M << std::endl;
arma::eig_sym( Eigenval , Eigenvecs , M );
#pragma omp ordered
RESULTS = arma::join_vert(RESULTS,Eigenval.t());
std::cout << i << " , " << tid << " --- " << Eigenval(0) << std::endl;
}
File << RESULTS;
File.close();
return 0;
}
相关文章:
- 编写代码时C++出现错误:错误 1 错误 C2601:'circle':本地函数定义是非法的
- 如何摆脱C ++中的分段错误错误?
- Clang 8 带有静态 constexpr 和数组的链接器错误 - 错误是什么以及如何解决它?
- 为什么每当我尝试运行此链接列表删除功能时都会收到分段错误错误?
- 如何解决分段错误错误C++
- 作为参数模板的模板类:MSVC 错误 - 错误 C2977:模板参数过多 (C++98)
- 安卓工作室 |CPP 文件错误错误: 位图库中对"AndroidBitmap_unlockPixels"的未定义引用
- 卷曲给出分段错误错误
- 无法访问 Arduino 结构字段。错误"退出状态 1。xxxx 不命名类型"
- 错误错误 C2872:"布尔值":kinect.h 的不明确符号
- C++打印模板容器错误(错误:"运算符<<"的不明确重载)理解?
- 结构的分割错误错误
- 为什么此代码返回分段错误错误?
- 错误错误:无法编译内置功能
- 分段错误错误C++
- C++ 1Z 错误:错误:演绎指南中声明中的显式限定
- 使用对数据类型的向量的哈希表中的分段错误错误
- 为什么此代码会导致分段错误错误
- JNA结构字段值错误
- C++段故障错误