Quantcast
Channel: Active questions tagged gcc - Stack Overflow
Viewing all articles
Browse latest Browse all 22014

Default scheduling in OpenMP (gcc compiler)

$
0
0

I am using OpenMP in a C++ progam. According to the gcc documentation, the default scheduling is dynamic with a chunk size of 1 ->https://gcc.gnu.org/onlinedocs/gcc-9.3.0/libgomp.pdf (p22).

I decided to test this so I wrote a simple C++ test program:

#include <chrono>#include <cmath>#include <iostream>#include <omp.h>#include <vector>int main(){    std::vector<double>  myArray {};    for(std::size_t i {0} ; i < 100000000 ; ++i)    {        myArray.push_back(static_cast<double>(i));    }    #pragma omp parallel    {        if(omp_get_thread_num() == 0)        {            std::cout << "Number of threads = "<< omp_get_num_threads() << "/"<< omp_get_num_procs() << std::endl;            omp_sched_t schedule {};            int chunk_size {};            omp_get_schedule(&schedule , &chunk_size);            std::string scheduleStr {};            switch(schedule)            {                case omp_sched_static:                    scheduleStr = "static";                    break;                case omp_sched_dynamic:                    scheduleStr = "dynamic";                    break;                case omp_sched_guided:                    scheduleStr = "guided";                    break;                case omp_sched_auto:                    scheduleStr = "auto";                    break;                default:                    scheduleStr = "monotonic";                    break;            }            std::cout << "Default schedule: "<< scheduleStr << ","<< chunk_size << std::endl;;        }    }    auto startTime {std::chrono::high_resolution_clock::now()};    #pragma omp parallel for default(shared) schedule(dynamic, 1)    for(std::size_t i = 0 ; i < myArray.size() ; ++i)    {        myArray[i] = std::pow(myArray[i], 10);    }    auto endTime {std::chrono::high_resolution_clock::now()};    auto ellapsedTime {std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime)};    std::cout << "OMP for Time: "<< static_cast<double>(ellapsedTime.count())/1000.0 << " s"<< std::endl;    return 0;}

I compiled the code using MSYS2's mingw version (gcc 9.3.0) with no optimisations and -g enabled. The default schedule is dynamic, 1 as in the documentation. However, the computation times on my computer are (with 2 threads):

  • with schedule(static) : ~2.103s
  • with schedule(dynamic, 1) : ~24.096s
  • omitting schedule (should be dynamic, 1) : ~2.101s

So that the default schedule seems to be static! I know I am asking a very specific question, but is it an intended behaviour ?


Viewing all articles
Browse latest Browse all 22014

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>