这两天在学习openMP,照着一些例子试了下,在试到atomic时却发现这样一个问题。
代码如下:
#include
#include
int main()
{
#pragma omp parallel num_threads(6)
{
for (int i = 0; i < 1000000; ++i);
}
int m;
double t, t2;
m = 0;
t = omp_get_wtime();
#pragma omp parallel num_threads(6)
{
for (int i = 0; i < 1000000; ++i)
++m;
}
t2 = omp_get_wtime();
std::cout << "value should be: " << 1000000 * 6 << std::endl;
std::cout << "value is: " << m << std::endl;
std::cout << "time(S): " << t2 - t << std::endl;
m = 0;
t = omp_get_wtime();
#pragma omp parallel num_threads(6)
{
for (int i = 0; i < 1000000; ++i)
#pragma omp critical
++m;
}
t2 = omp_get_wtime();
std::cout << "value should be: " << 1000000 * 6 << std::endl;
std::cout << "value is: " << m << std::endl;
std::cout << "time of critical(S): " << t2 - t << std::endl;
m = 0;
t = omp_get_wtime();
#pragma omp parallel num_threads(6)
{
for (int i = 0; i < 1000000; ++i)
#pragma omp atomic
++m;
}
t2 = omp_get_wtime();
std::cout << "value should be: " << 1000000 * 6 << std::endl;
std::cout << "value is: " << m << std::endl;
std::cout << "time of atomic(S): " << t2 - t << std::endl;
std::cin.get();
}
Debug下结果是对的:
Release下却是这样的:
有没有哪位大神知道是怎么回事?
不知道你这个问题是否已经解决, 如果还没有解决的话: