【发布时间】:2020-01-12 19:08:55
【问题描述】:
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <omp.h>
#define KE 10
#define NSTEPS 100
main()
{
float ex[KE],hy[KE];
float bn[NSTEPS];
int n,k,kc,ke;
float ddx,dt,T;
float t0,spread,pulse;
omp_set_num_threads(4);
kc = KE/2;
t0 = 40.0;
spread = 12;
T = 0;
FILE * temp = fopen("Exserial.txt", "w");
/* Initialize */
for ( k=0; k <= KE; k++ )
{
ex[k] = 0.0;
hy[k] = 0.0;
}
double strt=omp_get_wtime();
#pragma omp parallel shared(ex,hy,bn) private(n,k,T,pulse,t0,spread)
{
for ( n=1; n<=NSTEPS ; n++) {
T = T + 1;
pulse = exp(-.5*(pow( (t0-T)/spread,2.0) ));
ex[kc] = pulse;
/* Main FDTD Loop */
/* Calculate the Ex field */
#pragma omp critical
{
#pragma omp for
for ( k=1; k < KE; k++ )
{
#pragma omp atomic update
ex[k] = ex[k] + .5*( hy[k-1] - hy[k] ) ;
bn[n]=ex[100];
}
/* Calculate the Hy field */
#pragma omp for
for ( k=0; k < KE-1; k++ )
{
#pragma omp atomic update
hy[k] = hy[k] + .5*( ex[k] - ex[k+1] ) ;
}
}
}
}
double end=omp_get_wtime();
printf( "------------------%f\n",end-strt);
/* End of the Main FDTD Loop */
/* At the end of the calculation, print out the Ex and Hy fields */
for ( k=1; k <=KE; k++ )
{
fprintf(temp, "%f\n",ex[k]);
printf( "%f\n",ex[k]);
}
}
并行输出(使用线程数=4)
------------------0.013850
0.030408
-0.130364
0.107690
0.061082
0.023526
0.066983
-0.030821
-0.024117
0.037548
0.000000
串行输出
-0.013813
-0.028405
-0.044722
-0.064258
-0.087550
-0.072226
-0.062273
-0.055638
-0.052620
0.000000
我不知道我在哪里犯了错误,但我在并行程序中得到了不同的结果。它每次都给出不同的输出。
还有一个问题,即当我从顶部删除 #pragma omp parallel 时,我得到了正确的值,但没有时间优势。我必须添加#pragma omp parallel
所以需要一些解决方案。
【问题讨论】:
-
并行运行时的不同结果是数据竞争的重要指标。您还可以越界访问数组(因为
ex[KE]是末尾的一个,所以您的 for 循环应该一直运行到<而不是<=)。此外,bn被写入但从未读取,因此可以完全删除。 -
首先非常感谢您的帮助。但我仍然遇到同样的问题
标签: c multithreading parallel-processing openmp reduction