[OpenMP] я тупой или как?

doublemother

Пишу простенький код просто для сравнения OpenMP с однопоточностью:
#include <iostream>
int main(int argc, char **argv) {
int arr[1000][1000];
#pragma omp parallel for shared(arr) private(i,j)
for (int i=0; i<1000; i++) {
for (int j=0; j<1000; j++) {
arr[i][j] = i*j - i -j;
std::cout << i << " " << j << endl;
}
}
return 0;
}

И, точно такой же, только без прагмы. Компилирую, получаю в одном случае
real	1m35.311s
user 0m4.780s
sys 0m6.784s

Во втором:
real	4m8.212s
user 0m4.516s
sys 0m6.176s

Всё вроде бы нормально, но при этом числа сыплются в консоль строго по порядку. Как так происходит?

Ivan8209

> Всё вроде бы нормально, но при этом числа сыплются в консоль
> строго по порядку. Как так происходит?
Вообще говоря, ввод-вывод подразумевает наличие порядка, поэтому
ничего распараллеливаться не должно.
---
...Я работаю антинаучным аферистом...

doublemother

хмм, а если я хочу таки сыпать на консоль рандомными потоками?

sergeikozyr

ты не должен этого хотеть

doublemother

ты не должен этого хотеть
g++ точно не эпплом написан?)

sergeikozyr

ты гляди, сейчас тебя пи^Wяббловоды какашками закидают

Anturag

#include <iostream>
#include <omp.h>

using namespace std;

int main(int argc, char **argv)
{
int arr[1000][1000];
int i, j;

omp_set_num_threads(10);

#pragma omp parallel for shared(arr) private(i,j)
for (i = 0; i < 1000; i++)
{
for (j = 0; j < 1000; j++)
{
arr[i][j] = i * j - i - j;
cout << i << " " << j << endl;
}
}
return 0;
}

Учите свои любимые компиляторы, товарищи.
Используй -fopenmp, будет тебе счастье (от gcc-4.2 и выше особенно, RTF changelogs, иначе собирай компилер руками).
Почему не параллелится вложенный цикл - задачка на сообразительность :D .

doublemother

блин, ведь пытался omp_set_num_threads сделать, но потом подумал, что на 4.3 его еще нет, а есть только на 4.4.
Сейчас оказалось всё прозаичнее - в ебунте g++ скомпилен только с posix-многопоточностью :(
Кстати по поводу вложенного цикла - я так понимаю, ему просто потоков не хватит, я прав?)

vall

ты гляди, сейчас тебя пи^Wяббловоды какашками закидают
не не не, его закидают адепты GNU =)

doublemother

и лично RMS

geja_03

В 4.3.1 точно есть:
./gcc/libgomp/libgomp.map: omp_set_num_threads;
А про вложенный цикл я не понял откуда вообще вопрос возник...
Оставить комментарий
Имя или ник:
Комментарий: