Hlavní navigace

Názor k článku Rychlost CPythonu 3.11 a 3.12 v porovnání s JIT a AOT překladači Pythonu (2) od ZmatenejStrejda - Také by se dalo říci, že kdokoliv chce...

  • Článek je starý, nové názory již nelze přidávat.
  • 26. 11. 2023 0:42

    ZmatenejStrejda

    Také by se dalo říci, že kdokoliv chce pravou nefalšovanou efektivitu, tak sáhne po assembleru.

    Expresivita openmp je podle mě dostačující a já jako uživatel jsem snad nikdy neviděl apku co by uměla podrobnější nastavení než prostě počet použitých vláken.

    OpenMP není o tom aby vše bylo absolutně perfektní a dokonalé. Je tu pro ty co jsou ochotni za jednoduchost zaplatit určitým snížením efektivity.

    Když něco programuji co není hotové a do 2 minut to mám rychlejší třeba 10x, tak mě ty 2 minuty tolik nebolí když pak musím něco předělat.

    Řešení na váš požadavek jsem teda z hlavy nedal a musel jsem to vyhledat a zde by mohlo být řešení, je tedy trochu expresivnější než bych sám chtěl, ale vypadá to, že funguje.

    #include <stdio.h>
    #include <omp.h>
    
    int main() {
      #pragma omp teams num_teams(1) thread_limit(2)
      {
        #pragma omp parallel for
        for(int i = 0; i < 8; ++i){
          int thread_id = omp_get_thread_num();
          printf("Hello from FOR_1 from thread %d in team %d on idx %d\n", thread_id, omp_get_team_num(), i);
        }
      }
      return 0;
    }
    Hello from FOR_1 from thread 1 in team 0 on idx 4
    Hello from FOR_1 from thread 1 in team 0 on idx 5
    Hello from FOR_1 from thread 1 in team 0 on idx 6
    Hello from FOR_1 from thread 1 in team 0 on idx 7
    Hello from FOR_1 from thread 0 in team 0 on idx 0
    Hello from FOR_1 from thread 0 in team 0 on idx 1
    Hello from FOR_1 from thread 0 in team 0 on idx 2
    Hello from FOR_1 from thread 0 in team 0 on idx 3

    Dokonce můžeme například zpracovat 2 smyčky zároveň, každou pomocí 2 vláken

    #include <stdio.h>
    #include <omp.h>
    
    int main() {
      #pragma omp teams num_teams(2) thread_limit(2)
      {
        if (omp_get_team_num() == 0)
          #pragma omp parallel for
          for(int i = 0; i < 4; ++i){
            int thread_id = omp_get_thread_num();
            printf("Hello from FOR_1 from thread %d in team %d on idx %d\n", thread_id, omp_get_team_num(), i);
          }
    
        if (omp_get_team_num() == 1)
          #pragma omp parallel for
          for(int i = 0; i < 4; ++i){
            int thread_id = omp_get_thread_num();
            printf("Hello from FOR_2 from thread %d in team %d on idx %d\n", thread_id, omp_get_team_num(), i);
          }
      }
      return 0;
    }
    Hello from FOR_1 from thread 1 in team 0 on idx 2
    Hello from FOR_1 from thread 1 in team 0 on idx 3
    Hello from FOR_1 from thread 0 in team 0 on idx 0
    Hello from FOR_1 from thread 0 in team 0 on idx 1
    Hello from FOR_2 from thread 0 in team 1 on idx 0
    Hello from FOR_2 from thread 0 in team 1 on idx 1
    Hello from FOR_2 from thread 1 in team 1 on idx 2
    Hello from FOR_2 from thread 1 in team 1 on idx 3


    V případě vybíjení cache lines,
    by mohla fungovat klauzule schedule(static, "počet_prvků"), která nastaví, že každé vlákno zpracuje určitý počet prvků. Mám dojem že ve bez použití klauzule schedule, se prostě práce dělí počtem vláken (rozestup je maximální). Pokud v prvním kódu přidáme za "parallel for" klauzuli shedule(static,1), tak je výstup takovýto

    Hello from FOR_1 from thread 0 in team 0 on idx 0
    Hello from FOR_1 from thread 0 in team 0 on idx 2
    Hello from FOR_1 from thread 0 in team 0 on idx 4
    Hello from FOR_1 from thread 0 in team 0 on idx 6
    Hello from FOR_1 from thread 1 in team 0 on idx 1
    Hello from FOR_1 from thread 1 in team 0 on idx 3
    Hello from FOR_1 from thread 1 in team 0 on idx 5
    Hello from FOR_1 from thread 1 in team 0 on idx 7

    Pro více-dimenzionální případ bych zvážil ještě použití klauzule collapse

    Hlavně to neberte tak že se tu snažím tlačit OpenMP jako všelék. Všelék to rozhodně není. OpenMP není ani lepší než klasická vlákna, ani horší, je prostě jiné.

    Myslím, že je dobré aby lidé věděli že existuje a na co je a není vhodné.

    Btw blízké době budu studovat jeho použití pro programování na GPU, tak se kdyžtak podělím.