У меня есть этот последовательный код:
for (unsigned item = 0; item < totalItems; ++item) { // Outer loop
// Outer body
for (unsigned j = 0; j < maxSize; ++j) { // Inner loop
// Inner body
}
}
Моя цель - просто распараллелить внутренний цикл. Это можно сделать так:
for (unsigned item = 0; item < totalItems; ++item) { // Outer loop
// Outer body
#pragma omp parallel for
for (unsigned j = 0; j < maxSize; ++j) { // Inner loop
// Inner body
}
}
Проблема этого кода в том, что при каждом запуске внешнего цикла создаются новые потоки. Чтобы ускорить этот код, я хочу заранее создать команду потоков и использовать их несколько раз. Я обнаружил, что для этой цели существует директива #pragma omp for
.
#pragma omp parallel
for (unsigned item = 0; item < totalItems; ++item) { // Outer loop
// Outer body
#pragma omp for
for (unsigned j = 0; j < maxSize; ++j) { // Inner loop
// Inner body
}
}
Однако, если я правильно понимаю, использование директивы #pragma omp parallel
приводит к тому, что внешний цикл запускается несколько раз. Это правильно?
Редактировать :
Вот более подробный пример:
// Let say that the image is represented as an array of pixels
// where pixels is just one integer.
std::vector<Image> images = getImages();
for (auto & image : images) { // Loop over all images
#pragma omp parallel for
for (unsigned j = 0; j < image.size(); ++j) { // Loop over each pixel
image.at(j) += addMagicConstant(j);
}
}
Цель : я хочу порождать команду потоков, а затем использовать их многократно для распараллеливания только внутреннего цикла (= цикл по пикселям изображения).