C打开mp错误计算,无打印

9w11ddsr  于 2023-01-04  发布在  其他
关注(0)|答案(1)|浏览(141)
#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 = 0b = 1,应为1/3)在for循环中没有注解行,但使用printf时计算正确。我不明白这个问题
没有printf

对于相同的ab,使用printf(大输出的最后一行):

我正在使用Microsoft Windows 10和Microsoft Visual Studio。

ie3xauqp

ie3xauqp1#

在您的代码中,变量sum由多个线程共享,每个线程都在修改该变量,并且该变量遇到争用情况。要解决此问题,您可以使用OpenMP指令中的reduction子句,指定应使用+运算符来减少sum变量:

#pragma omp parallel for reduction(+:sum)
for (i = 0; i < n; i++)
{
float randomNumber = FloatRandomizer(a, b);
sum = sum + F(randomNumber);
}

相关问题