Задача состоит в поиске в очень большом векторе элемента, удовлетворяющего некоторым условиям (проверка достаточно затратна по времени). C OpenMP раньше дела не имел. Реализовал для примера поиск минимального элемента в массиве. Каждый из потоков ищет минимальный элемент в выделенной ему части массива, затем выбирается минимальный элемент из минимальных элементов для каждой части массива.
Компилирую и запускаю:
$ g++ -fopenmp main.cpp
$ ./a.out 1
Time: 1.92
$ ./a.out 2
Time: 2.02
$ ./a.out 3
Time: 2
Почему время поиска не меняется в зависимости от числа потоков? (в системе 2 ядра, top показывает правильное число потоков).
main.cpp:
#include <omp.h>
#include <vector>
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <limits>
typedef unsigned int Element;
typedef std::vector<Element> Array;
unsigned int getMinElement(const Array& array, int threadsCount) {
omp_set_num_threads(threadsCount);
Array minElements(
threadsCount,
std::numeric_limits<Element>::max()
);
int size(array.size());
#pragma omp parallel for schedule(static)
for (int i = 0; i < size; ++i) {
int threadNum(omp_get_thread_num());
if (array[i] <= minElements[threadNum])
minElements[threadNum] = array[i];
}
Element minElement(minElements[0]);
for (int i = 1; i < minElements.size(); ++i)
if (minElements[i] < minElement)
minElement = minElements[i];
return minElement;
}
int main(int argc, char** argv) {
Array a;
for (unsigned int i = 0; i < 100000000; ++i)
a.push_back(rand());
if (argc < 2)
exit(1);
clock_t startTime(clock());
unsigned int minElement(getMinElement(a, atoi(argv[1])));
clock_t arrayProcessTime(clock() - startTime);
std::cout << " Time: "
<< double(arrayProcessTime) / CLOCKS_PER_SEC << std::endl;
return 0;
}