#include<stdio.h>
#include<omp.h>
#include<stdlib.h>
float FloatRandomizer(float a, float b)
{
float randomNumber = (a + (float)rand() / (float)(RAND_MAX / b));
if (randomNumber > b)
randomNumber = randomNumber - a;
return randomNumber;
}
float F(float x)
{
return x * x;
}
int main()
{
int n = 1000000;
float a;
printf("a = "); scanf_s("%f", &a);
float b;
printf("b = "); scanf_s("%f", &b);
float temp = (b - a) / n;
float sum = 0;
int i;
#pragma omp parallel for shared(sum)
for (i = 0; i < n; i++)
{
float randomNumber = FloatRandomizer(a, b);
sum = sum + F(randomNumber);
//printf("threadNum = %d\nsum = %f\n", omp_get_thread_num(), sum);
}
float result = temp * sum;
printf("result = %f", result);
}
没有太多的东西要说。我试图用蒙特-卡罗方法得到给定[a,B]范围内的定积分。所以基本上一切都正常,问题从我写#pragma open mp for
语句开始。它计算结果(对于a = 0
和b = 1
,应为1/3
)在for
循环中没有注解行,但使用printf
时计算正确。我不明白这个问题
没有printf
:
对于相同的a
和b
,使用printf
(大输出的最后一行):
我正在使用Microsoft Windows 10和Microsoft Visual Studio。
1条答案
按热度按时间ie3xauqp1#
在您的代码中,变量sum由多个线程共享,每个线程都在修改该变量,并且该变量遇到争用情况。要解决此问题,您可以使用OpenMP指令中的reduction子句,指定应使用+运算符来减少sum变量: