Не понимайте, где я понимаю это превратно. Если скомпилировано без поддержки openmp, код работает правильно. Но с openmp переменными, кажется, получают неправильную видимость.
У меня было следующее намерение. Каждый поток имеет свой собственный max_private, в котором он находит локальный максимум. Затем глобальный максимум найден в критическом разделе.
#include <iostream>
#include <vector>
typedef std::vector<long> Vector;
long max(const Vector& a, const Vector& b)
{
long max = 0;
#pragma omp parallel
{
long max_private = 0;
#pragma omp single
{
for ( Vector::const_iterator a_it = a.begin();
a_it != a.end();
++a_it)
{
#pragma omp task
{
for ( Vector::const_iterator b_it = b.begin();
b_it != b.end();
++b_it)
{
if (*a_it + *b_it > max_private) {
max_private = *a_it + *b_it;
}
}
}
}
}
#pragma omp critical
{
std::cout << max_private << std::endl;
if (max_private > max) {
max = max_private;
}
}
}
return max;
}
int main(int argc, char* argv[])
{
Vector a(100000);
Vector b(10000);
for (long i = 0; i < a.size(); ++i) {
a[i] = i;
}
for (long i = 0; i < b.size(); ++i) {
b[i] = i * i;
}
std::cout << max(a, b) << std::endl;
return 0;
}
Я не хочу использовать параллель для, потому что последний я собираюсь использовать структуры данных, которые не поддерживают итераторы произвольного доступа.
Я использовал g ++-4.4 компилятора.
Получил подробный ответ на форуме OpenMP. http://openmp.org/forum/viewtopic.php?f=3&t=912&start=0
Пришлось сделать max_private threadprivate.
Я думаю, что вам нужны некоторые атрибуты для переменных. По умолчанию все переменные являются общими, и поскольку вы хотите, чтобы max_private была индивидуальной для каждого потока, вы можете добавить к ее объявлению условие 'private' (тогда она может работать немного быстрее).
Для max вам нужно поместить ее внутрь блока omp, и пометить ее 'shared', если она все еще не работает должным образом (хотя она должна быть в порядке, как у вас)
Итак, я думаю, вам нужно #pragma omp parallel private(max_private)
и поместить обе переменные вне основного блока omp.