c语言 - 为什么"#pragma omp atomic"使用 omp_num_threads is 1 时增加运行时间?



我正在学习如何在C程序中使用OpenMP。我注意到"#pragma omp atomic";即使在更新1d数组时线程数为1,也会增加运行时间。这是我的代码:

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <mpi.h>
#include <omp.h>
double fixwork(int a, int n) //n==L
{
int j;
double s, x, y;
double t = 0;
for (j = 0; j < n; j++)
{
s = 1.0 * j * a;
x = (1.0 - cos(s)) / 2.0;
y = 0.31415926 * x; 
t += y;
}
return t;
}
int main(int argc, char* argv[])
{
int n = 100000;
int p = 1;
int L = 2;
int q = 100;
int g = 7;
int i, j, k;
double v;
int np, rank;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &np);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);

double* u = (double*)calloc(n * g, sizeof(double));
double* w = (double*)calloc(n * g, sizeof(double));

double omptime1 = -MPI_Wtime();
#pragma omp parallel for private(k, j, v) num_threads(p)
for (i = 0; i < n; i++)
{
k = i * (int)ceil(1.0 * (i % q) / q);
for (j = 0; j < g; j++)
{
v = fixwork(i * g + j, L);
#pragma omp atomic 
u[k] += v;
}
}
omptime1 += MPI_Wtime();

printf("npragma time = %f", omptime1);
MPI_Finalize();
return 0;
}

我遵守了这个代码:

mpiicc -qopenmp atomictest.c -o atomic

使用1个openmp线程和1个mpi进程,观察到的时间(使用原子(/时间(无原子(的比率为~1.28(n=1e6(,~1.07(n=1e7(,对于较小的n,甚至更大。为什么会有这样的表现?";omp原子";以及";c++原子";?感谢

这里有部分答案:

如果启用OpenMP,gcc必须生成不同的代码对于仅在运行时已知的任何数量的线程。。。。。这个编译器必须使用不同的原子指令花钱多的

相关内容

最新更新