Tôi đang giải quyết một vấn đề lớn hơn nhiều và đã gặp lỗi khi cố gắng sử dụng OpenMP để song song một số vòng lặp. Tôi đã sao chép vấn đề với một số mã đơn giản dưới đây bắt chước mã của riêng tôi.Sử dụng OpenMP và Eigen gây ra vòng lặp vô hạn/bế tắc
Vấn đề là khi tôi chạy chương trình, nó sẽ ngẫu nhiên đi vào một số loại vòng lặp vô hạn/bế tắc (CPU là 100%, nhưng không làm gì cả). Từ những gì tôi có thể nói từ thử nghiệm của tôi, một trong những chủ đề cố gắng để tính toán sản phẩm ma trận ma trận nhưng không bao giờ kết thúc vì một lý do nào đó.
Tôi biết rằng nếu bạn bật OpenMP, Eigen sẽ song song các sản phẩm ma trận ma trận bằng cách sử dụng OpenMP. Tôi cũng thêm một vòng lặp song song khác bên ngoài này. Tuy nhiên, lỗi này vẫn xảy ra nếu tôi vô hiệu hóa song song của Eigen bằng cách xác định EIGEN_DONT_PARALLELIZE.
Tôi đang sử dụng phiên bản gcc 4.6.0 20101127 trên MacOS 10.6.8 với Eigen 3.0.4.
tôi không thể tìm ra những gì có thể đi sai ...
#include <iostream>
#include <Eigen/Core>
using namespace std;
using namespace Eigen;
MatrixXd Test(MatrixXd const& F, MatrixXd const& G)
{
MatrixXd H(F.rows(), G.cols());
H.noalias() = F*G;
return H;
}
int main()
{
MatrixXd F = MatrixXd::Random(2,2);
MatrixXd G = MatrixXd::Random(2,2);
#pragma omp parallel for
for (unsigned int i = 0; i < 10000; ++i)
MatrixXd H = Test(F,G);
cout << "Done!" << endl;
}
Có phải 'MatrixXd :: Random' an toàn không? – Mysticial
Trong mã thực sự của tôi, tôi không gọi MatrixXd :: Ngẫu nhiên. Chỉnh sửa: Tôi đã thay đổi mã để loại bỏ các cuộc gọi đến MatrixXd :: Ngẫu nhiên và lỗi vẫn còn đó. – user1144371
nó không phải là một cái gì đó ngu ngốc như [this] (http://eigen.tuxfamily.org/dox/TopicWrongStackAlignment.html)? Bởi vì hiện tại điều này không giống như một lỗi openmp. Tôi đã tải xuống và chạy chương trình của bạn song song mà không gặp bất kỳ sự cố nào với phiên bản gcc 4.5.0 20100604. – Bort