== Examples == === Using task === From: https://software.intel.com/en-us/forums/intel-moderncode-for-parallel-architectures/topic/544780 {{{#!highlight c struct Frame { int bufferNumber; // 0, 1, ... nFrames-1 uint8_t* buffer; // buffer[bufferSize]; ... Frame(int n, size_t size) { bufferNumber = n; buffer = new uint8_t[size]; } ~Frame() { if(buffer) delete [] buffer; }; int nFrames = 0; // You determine number of buffers (should be > nThreads) Frame* Frames = NULL; // [nFrames]; ... nFrames = omp_get_max_threads() + someMore; Frames = new Frame*[nFrames]; for(int i=0; i < nFrames - 1; ++i) Frames[i] = new Frame(i, YourFrameSize); volatile int frame_empty_index = 0; volatile int frame_fill_index = 0; #pragma omp parallel { #pragma omp master { for(Frame* frame=get_next_frame(); frame; frame=get_next_frame()) { #pragma omp task { doWork(frame); while(frame->bufferNumber != frame_fill_index) Sleep(0); // release time slice write_frame(frame); frame_fill_index = (frame_fill_index + 1) % nFrames; } } // for } // master } // Frame* get_next_frame() { // wait for buffer while((frame_empty_index + 1) % nFrames == frame_fill_index) Sleep(0); // release time slice Frame* frame = frames[frame_empty_index]; frame_empty_index = (frame_empty_index +1) % nFrameBuffers; read_frame(frame); return frame; } void write_frame(Frame* frame) { while(frame->bufferNumber != frame_fill_index) Sleep(0); write(frame); frame_fill_index = (frame_fill_index + 1) % nFrames; } void doWork(Frame* frame) { ... } }}} Use of OpenMP in ImageMagick: https://github.com/ImageMagick/ImageMagick/search?utf8=%E2%9C%93&q=pragma+omp&type=Code == Links == [[https://software.intel.com/en-us/articles/improve-performance-with-vectorization#footnote1|Improve Performance with Vectorization | IntelĀ® Software]] [[https://www.youtube.com/watch?v=o4UUnr8X8bI|Speed Up Image Processing with OpenMP - YouTube]] [[http://bisqwit.iki.fi/story/howto/openmp/|Guide into OpenMP: Easy multithreading programming for C++]] [[https://lists.blender.org/pipermail/bf-blender-cvs/2015-December/082469.html|[Bf-blender-cvs] [e6c6b5d] buildbot_linux_cmake: Buildbot: Link statically against gomp for CMake Linux slave]]: Linking libgomp (OpenMP runtime) statically w/ CMake/gcc