Armadillo solution () thread güvenli midir?


86

Kodumda, üzerinde belirlenmiş doğrusal sistemi kurduğum ve çözmeye çalıştığım bir döngü var:

#pragma omp parallel for
for (int i = 0; i < n[0]+1; i++) {
    for (int j = 0; j < n[1]+1; j++) {
        for (int k = 0; k < n[2]+1; k++) {
            arma::mat A(max_points, 2);
            arma::mat y(max_points, 1);
            // initialize A and y

            arma::vec solution = solve(A,y);
        }
    }
}

Bazen, oldukça rastgele bir şekilde program askıda kalıyor veya çözüm vektöründeki sonuçlar NaN. Ve bunu yaparsam:

arma::vec solution;
#pragma omp critical 
{
    solution = solve(weights*A,weights*y);
}

o zaman bu problemler artık olmuyor gibi görünüyor.

Kilitlendiğinde, bunu yapar çünkü bazı iş parçacıkları OpenMP bariyerinde beklemektedir:

Thread 2 (Thread 0x7fe4325a5700 (LWP 39839)):
#0  0x00007fe44d3c2084 in gomp_team_barrier_wait_end () from /usr/lib64/gcc-4.9.2/lib64/gcc/x86_64-redhat-linux-gnu/4.9.2/libgomp.so.1
#1  0x00007fe44d3bf8c2 in gomp_thread_start () at ../.././libgomp/team.c:118
#2  0x0000003f64607851 in start_thread () from /lib64/libpthread.so.0
#3  0x0000003f642e890d in clone () from /lib64/libc.so.6

Ve diğer konular Armadillo'nun içine sıkışmış durumda:

Thread 1 (Thread 0x7fe44afe2e60 (LWP 39800)):
#0  0x0000003ee541f748 in dscal_ () from /usr/lib64/libblas.so.3
#1  0x00007fe44c0d3666 in dlarfp_ () from /usr/lib64/atlas/liblapack.so.3
#2  0x00007fe44c058736 in dgelq2_ () from /usr/lib64/atlas/liblapack.so.3
#3  0x00007fe44c058ad9 in dgelqf_ () from /usr/lib64/atlas/liblapack.so.3
#4  0x00007fe44c059a32 in dgels_ () from /usr/lib64/atlas/liblapack.so.3
#5  0x00007fe44f09fb3d in bool arma::auxlib::solve_ud<double, arma::Glue<arma::Mat<double>, arma::Mat<double>, arma::glue_times> >(arma::Mat<double>&, arma::Mat<double>&, arma::Base<double, arma::Glue<arma::Mat<double>, arma::Mat<double>, arma::glue_times> > const&) () at /usr/include/armadillo_bits/lapack_wrapper.hpp:677
#6  0x00007fe44f0a0f87 in arma::Col<double>::Col<arma::Glue<arma::Glue<arma::Mat<double>, arma::Mat<double>, arma::glue_times>, arma::Glue<arma::Mat<double>, arma::Mat<double>, arma::glue_times>, arma::glue_solve> >(arma::Base<double, arma::Glue<arma::Glue<arma::Mat<double>, arma::Mat<double>, arma::glue_times>, arma::Glue<arma::Mat<double>, arma::Mat<double>, arma::glue_times>, arma::glue_solve> > const&) ()
at /usr/include/armadillo_bits/glue_solve_meat.hpp:39

Yığın izlemeden de görebileceğiniz gibi, Armadillo sürümüm atlas kullanıyor. Ve bu dokümantasyona göre atlas iş parçacığı açısından güvenli görünüyor: ftp://lsec.cc.ac.cn/netlib/atlas/faq.html#tsafe

Güncelleme 9/11/2015

Sonunda Vladimir F.'in önerilerine dayanarak daha fazla test yapmak için biraz zaman buldum

Armadillo'yu ATLAS'ın BLAS'ı ile derlediğimde, hala yeniden üretebiliyorum, sonra kilitleniyor ve NaN'leri. Kilitlendiğinde, yığın izlemesinde değişen tek şey BLAS'a yapılan çağrıdır:

#0  0x0000003fa8054718 in ATL_dscal_xp1yp0aXbX@plt () from /usr/lib64/atlas/libatlas.so.3
#1  0x0000003fb05e7666 in dlarfp_ () from /usr/lib64/atlas/liblapack.so.3
#2  0x0000003fb0576a61 in dgeqr2_ () from /usr/lib64/atlas/liblapack.so.3
#3  0x0000003fb0576e06 in dgeqrf_ () from /usr/lib64/atlas/liblapack.so.3
#4  0x0000003fb056d7d1 in dgels_ () from /usr/lib64/atlas/liblapack.so.3
#5  0x00007ff8f3de4c34 in void arma::lapack::gels<double>(char*, int*, int*, int*, double*, int*, double*, int*, double*, int*, int*) () at /usr/include/armadillo_bits/lapack_wrapper.hpp:677
#6  0x00007ff8f3de1787 in bool arma::auxlib::solve_od<double, arma::Glue<arma::Mat<double>, arma::Mat<double>, arma::glue_times> >(arma::Mat<double>&, arma::Mat<double>&, arma::Base<double, arma::Glue<arma::Mat<double>, arma::Mat<double>, arma::glue_times> > const&) () at /usr/include/armadillo_bits/auxlib_meat.hpp:3434

ATLAS olmadan, yalnızca netlib BLAS ve LAPACK ile derleme, NaN'leri yeniden üretebildim, ancak kilitlenmeleri değil.

Her iki durumda da, omp kritik solve()ile çevrelemek #pragmahiç sorunum yok


1
/Usr/lib64/libblas.so.3 atlas'ın parçası mı? Neden / usr / lib64 / atlas içinde bulunmuyor?
Vladimir F

1
Hayır, opensuse'de liblas3 paketinin bir parçası ve redhat'te paket blas'ın bir parçası.
maxdebayser

2
Bu durumda, varsayılan BLAS'ı kullandığınızda herhangi bir ATLAS garantisini kullanamazsınız.
Vladimir F

2
Bunu çözdün mü? Değilse, hangi paketler kurulur ve programı derlemek için kullandığınız komutu gönderebilir misiniz?
vindvaki

3
Atlas yerine OpenBLAS kullanmayı da deneyebilirsiniz .
mtall

Yanıtlar:


2

Sistemlerinizin aşırı kararlı olduğundan emin misiniz? solve_udyığın izlemeniz aksini söylüyor. Senin de olmasına rağmen solve_odve muhtemelen bunun sorunla ilgisi yok. Ancak bunun neden olduğunu bulmak ve sistemlerin normal olması gerektiğini düşünüyorsanız düzeltmek zarar vermez.

Armadillo solution () thread güvenli midir?

Ben senin LAPACK sürümüne bağlıdır düşünüyorum Yani, ayrıca bkz bu . Baktığımızda kodun içinde solve_oderişilen tüm değişkenler yerel görünmektedir. Koddaki uyarıya dikkat edin:

NOT: ATLAS 3.6 tarafından sağlanan lapack kitaplığındaki dgels () işlevinde sorunlar var gibi görünüyor

Bu yüzden sadece lapack::gelssizin için sorun yaratabilir gibi görünüyor . Lapack'i düzeltmek mümkün değilse, bir çözüm, sistemlerinizi istiflemek ve tek bir büyük sistemi çözmektir. Bireysel sistemleriniz küçükse bu muhtemelen daha da verimli olacaktır.


1

Armadillo'nun solve()işlevinin iş parçacığı güvenliği , kullandığınız BLAS kitaplığına bağlıdır (yalnızca). BLAS olduğunda LAPACK uygulamaları iş parçacığı açısından güvenlidir. Armadillo solve()işlevi, referans BLAS kitaplığına bağlanırken iş parçacığı açısından güvenli değildir . Ancak, OpenBLAS kullanırken iş parçacığı güvenlidir . Ek olarak, ATLAS , iş parçacığı güvenli olduğundan bahseden bir BLAS uygulaması sağlar ve Intel MKL de iş parçacığı için güvenlidir , ancak bu kitaplıklarla bağlantılı Armadillo ile ilgili deneyimim yok.

Elbette, bu yalnızca solve()farklı verilere sahip birden çok iş parçacığından çalıştırdığınızda geçerlidir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.