Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.07.2012, 14:25   #1
nemato
 
Регистрация: 27.07.2012
Сообщений: 3
По умолчанию Как это распараллелить?

Начал учить опен мп протокол.
Как можно найти расстояние между N точек?

Как это распараллелить?
int main() {
for (i=0; i<NP-1; i++ )
for (j=i+1;j<NP;j++)
d=distance(x1,y1,x2,y2);
}
nemato вне форума Ответить с цитированием
Старый 31.07.2012, 17:51   #2
rlib
Форумчанин
 
Аватар для rlib
 
Регистрация: 22.05.2012
Сообщений: 352
По умолчанию

Так, например:

Код:
#include <stdio.h>
#include <omp.h>

#define NP 21221

int main() {
	int i, j;
	unsigned long k, sumk, expk;
	sumk = 0;

#pragma	omp parallel private(j,k) 
	{
		k = 0;
#pragma omp for
		for (i=0; i<NP-1; ++i) {
			for (j=i+1;j<NP; ++j) {
				++k;
			}
		}
#pragma omp atomic
		sumk += k;
		
	}
	if ( NP % 2 == 0 ) 
		expk = (NP/2)*(NP-1);
	else
		expk = ((NP-1)/2)*NP;
	printf("sumk=%lu\nExpected k=%lu\n", sumk, expk);
	system("PAUSE");
	return 0;
}
rlib вне форума Ответить с цитированием
Старый 31.07.2012, 22:55   #3
nemato
 
Регистрация: 27.07.2012
Сообщений: 3
По умолчанию

спасибо!
можно откаментировать?
nemato вне форума Ответить с цитированием
Старый 01.08.2012, 12:27   #4
rlib
Форумчанин
 
Аватар для rlib
 
Регистрация: 22.05.2012
Сообщений: 352
По умолчанию

У вас два цикла. Верхний (i) автоматом разбивается OMP на кол-во доступных потоков (равен кол-ву ваших cpu cores по дефолту). Внутренний цикл пробегается каждым из потоков. Поэтому делаем переменную j частной для каждого потока, чтобы избежать самой распространенной oшибки паралельного програминга - racing condition между потоками. В k подсчитываем кол-во итераций каждого потока (поэтому k тоже частный per поток). expk (expected k) равен кол-ву дистанций между точками, следовательно это число, которому должнa быть равна сумма всех k из всех потоков - сделано исключительно для проверки правильности работы алгоритма.
#pragma omp atomic необходима для исключения racing condition опять, но уже после выхода из цыкла каждого из потоков. Можно пользовать critical section (#pragma omp critical), но тогда будет куда тормознутее.
rlib вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Распараллелить выполнение задачи и осуществить синхронизация подзадач по сети. UDP. [C++ Builder] Radisson Фриланс 1 12.01.2012 04:51
Не получается распараллелить!!! Unikum1979 Общие вопросы C/C++ 1 05.11.2011 20:26
Как распараллелить потоки Lindemann66 Qt и кроссплатформенное программирование С/С++ 1 08.09.2011 13:58
"Mail.Ru Агент" что это? и как это? Nick007 Софт 9 21.11.2009 10:13
Что это такое и как это того... Alex Cones Общие вопросы Delphi 2 11.10.2009 12:04