Консультация № 187104
16.01.2013, 14:51
154.23 руб.
16.01.2013, 14:54
0 4 1
Здравствуйте! Прошу помощи в следующем вопросе: нужно изменить код программы под другую формулу

Код:
// 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;
}

Обсуждение

Неизвестный
16.01.2013, 14:52
общий
формула по которой нужно исправить
Прикрепленные файлы:
9c90778afa0d3c44a3c322fdc21bd12c.png
давно
Посетитель
7438
7205
17.01.2013, 13:11
общий
это ответ
Здравствуйте, Евгений!
Изменения:
1) добавил #include <math.h> для использования математических функций sin(), exp()
2) изменил функцию f(x)
3) изменил пределы интегрирования a и b
4) в выводе убрал вывод погрешности, который для данной функции не соответствует действительности
[code h=200]#include "stdafx.h"
#include <omp.h>
#include <stdlib.h>
#include <iostream>
#include <stdio.h>
#include <math.h>
//число разбиений области интегрирования
const int N = 100000000;
//подынтегральная функция
double f (double x)
{
return exp(-x*x+0.38)/(2.+sin(1./(1.5+x*x)));
}
int _tmain(int argc, _TCHAR* argv[])
{
//включаем поддержку русского языка в консоли
setlocale(LC_ALL, "Russian");
//диапазон интегррования
double a = 0.4, 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();
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\n", sum);
//выводим время работы теста на экран
printf("Время вычисления %f\n", endTime - startTime);
return 0;
}[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
17.01.2013, 13:30
общий
Адресаты:
он кроме 31 строки не выводит ничего на экран не считает правильно?
давно
Посетитель
7438
7205
17.01.2013, 13:48
общий
17.01.2013, 14:07
Все считается правильно.
Просто строка "висит", пока идет расчет.
Потом выводится результат и тут же окно программы закрывается.
Запустите полученную программу из окна CMD или добавьте в конце ожидание нажатия на клавишу...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа