gpt4 book ai didi

c++ - openmp 被 visual studio c++ 优化破坏

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:49:06 27 4
gpt4 key购买 nike

到目前为止,我已经将 OpenMP 与 Visual Studio 2010 结合使用了很长一段时间,但今天我遇到了 VS 的另一个令人费解的怪癖。在切断所有可能的嫌疑人之后,我只剩下下面的程序。它只是在一个周期内计数,有时会进行一些计算并生成计数器。

#include "stdafx.h"
#include "omp.h"
#include <string>
#include <iostream>
#include <time.h>


int _tmain(int argc, _TCHAR* argv[])
{
int count = 0;
double a = 1;
double b = 2;
double c = 3, mean_tau = 1, r_w = 1, weights = 1, r0 = 1, tau = 1, sq_tau = 1,
r_sw = 1;
#pragma omp parallel num_threads(3) shared(count)
{
int tid = omp_get_thread_num();
int pers_count = 0;
std::string someline;
for (int i = 0; i < 100000; i++)
{
pers_count++;
#pragma omp critical
{
count++;
if ((count%10000 == 0))
{

sq_tau = (r_sw / weights) * pow( 1/ r0 * tau, 2);
std::cout << count << " " << pers_count << std::endl;
}
}
}
}
std::getchar();
return 0;
}

现在,如果我在禁用优化 (/Od) 的情况下编译它,它会正常工作,将它们的共享计数器与它的私有(private)计数器(大约小三倍)一起吐出,类似于

10000 3890
20000 6523
...
300000 100000

如果我打开优化(我尝试了所有选项,但为了清楚起见,让我们说/O2),但是,由于某种原因共享计数似乎变成私有(private)的,因为我开始得到类似的东西

10000 10000
10000 10000
10000 10000
...
60000 60000
50000 50000
...
100000 100000

现在我遇到了这个怪癖,即使我不做任何更改,以前可以正常工作的所有内容都会以某种方式重建为错误的版本。这可能是什么原因造成的,我该怎么办?谢谢。

最佳答案

我不知道为什么共享 count 会这样。我可以提供一个解决方法(假设您只对共享变量使用原子操作):

#pragma omp critical
{
#pragma omp atomic
count++;
if ((count%10000 == 0))
{

sq_tau = (r_sw / weights) * pow( 1/ r0 * tau, 2);
std::cout << count << " " << pers_count << std::endl;
}
}

关于c++ - openmp 被 visual studio c++ 优化破坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32458693/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com