Jak vyrobit GNU GCC optimalizovat OpenMP vlákna podobně

hlasů
3

To je můj první příspěvek zde. Hurá! Zpět k problému:

Učím se, jak používat OpenMP. Můj IDE je Code :: Blocks. Chci zlepšit některé z mých starších programů. Musím mít jistotu, že výsledky budou přesně stejné. Zdá se, že „pro“ smyčky jsou optimalizovány jinak v hlavním vlákně než v jiných tématech.

Příklad:

#include <iostream>
#include <omp.h>
int main()
{
    std::cout.precision(17);
    #pragma omp parallel for schedule(static, 1) ordered
    for(int i=0; i<4; i++)
    {
        double sum = 0.;
        for(int j=0; j<10; j++)
        {
            sum += 10.1;
        }
        #pragma omp ordered
        std::cout << thread  << omp_get_thread_num() <<   says  << sum << \n;
    }
    return 0;
}

produkuje

thread 0 says 101
thread 1 says 100.99999999999998579
thread 2 says 100.99999999999998579
thread 3 says 100.99999999999998579

Mohu nějak zajistit, aby všechny závity obdrží stejnou optimalizaci než mé jednovláknových programů (které nevyužila OpenMP) obdrželi?

UPRAVIT:

Překladač je kompilátoru a GDB debugger z TDM-GCC (verze 4.9.2, 32 bitů, SJLJ), co to znamená. Je to IDE je „default“. Nejsem obeznámen s kompilátoru rozdíly.

Výstup za předpokladu, pochází z „release“ verzi, která se přidává argument „-O2“.

Žádný z -O, -O1 a -O3 argumenty vytváří 101.

Můžete zkusit svůj exe z Dropbox (zip soubor, obsahuje také případně požadovaných DLL) .

Položena 01/03/2016 v 13:23
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
2

To se děje proto i float nebo dvojité datový typ nemůže představovat nějaká čísla jako 20.2

#include <iostream>
int main()
{
    std::cout.precision(17);
    double a=20.2;
    std::cout << a << std::endl;
    return 0;
}

jeho výstup bude

20.199999999999999

Pro více informací o tomto naleznete neočekávané výstup při přidávání dvě čísla float

Nevím, proč to není děje z prvního vlákna, ale pokud odebrat OpenMP pak taky dostanete stejný výsledek.

Odpovězeno 01/03/2016 v 15:44
zdroj uživatelem

hlasů
0

Z toho, co jsem si to prostě číselná přesnost. Pro typ double hodnotu, měli byste očekávat, že 16 číslic přesnosti.

Tedy výsledkem je 101 +/- 1.E-16 * 101

To přesně rozsah dostanete. A pokud jste něco jako čtyřnásobný přesností použít, je to tak dobré, jak to dostane.

Odpovězeno 01/03/2016 v 15:36
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more