// OpenMP-Example.cpp
#include "stdafx.h"
#include <omp.h>
#include <stdlib.h>
#include <iostream>
#include <stdio.h>
//число разбиений области интегрирования
const int N = 100000000;
//подынтегральная функция
double f (double x)
{
return log(1.0/x);
}
int _tmain(int argc, _TCHAR* argv[])
{
//включаем поддержку русского языка в консоли
setlocale(LC_ALL, "Russian");
//диапазон интегррования
double a = 0.000001, b = 1.0;
//отключение выбора количества потоков (нитей) по умолчанию
omp_set_dynamic(false);
//заданние числа используемых потоков
omp_set_num_threads(2);
//определение типа переменных блока распараллеливания
int nTheads, theadNum;
#pragma omp parallel private(nTheads, theadNum)
{
nTheads = omp_get_num_threads();
18
theadNum = omp_get_thread_num();
//вывод на экран номера и количества используемых потоков
printf("OpenMP поток №%d из %d потоков\n", theadNum, nTheads);
}
//переменные для хранения суммы, значения аргумента и счетчик цикла
double sum = 0.0, x;
int i;
//сохраняем время начала теста
double startTime = omp_get_wtime();
//начало области распараллеливания цикла переменная i -
//приватная, переменная sum обновляется всеми потоками
#pragma omp parallel for default(shared)\
private(i) schedule(static,10)\
reduction (+:sum)
for (i = 0; i < N; i++)
{
x = a + (b-a)*(i-0.5)/N;
sum += f(x);
}
//сохраняем время окончания теста
double endTime = omp_get_wtime();
//выводим сообщения об окончании работы потоками
#pragma omp parallel private(theadNum)
{
theadNum = omp_get_thread_num();
printf("Поток №%d окончил вычисления... \n", theadNum);
}
//вычисление итогового результата и печать на экран
sum = sum/N;
printf("Результат = %f (Ошибка вычисления: %f)\n", sum, 1.0 - sum);
//выводим время работы теста на экран
printf("Время вычисления %f\n", endTime - startTime);
return 0;
}
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.