我在我的大学的服务器上运行了一个程序,该程序有4个双核AMD Opteron(tm)处理器2210 HE和O.S.是Linux版本2.6.27.25-78.2.56.fc9.x86_64。我的程序实现了Conways Game of Life,它使用pthreads和openmp运行。我使用1-8个线程使用getimeofday()函数对程序的并行部分进行了定时。但时机似乎并不正确。我得到最大的时间使用1个线程(如预期),然后时间变得更小。但我得到的最小时间是当我使用4个线程。在具有4个双核Cpu的服务器上使用1-8个线程的程序定时问题?
这里是一个例子,当我使用数组1000x1000。使用2个螺纹〜4,73秒,使用3〜3.64秒,使用4〜2.99秒,使用5〜4,19秒,使用6〜3.84,使用7〜3.62秒, 3.34,用8〜3.12。
上述时间是当我使用pthreads。当我使用openmp的时机较小,但遵循相同的模式。
我预计时间会从1-8减少,因为4双核心cpus?我认为,因为有4个CPU和2个内核,8个线程可以同时运行。它是否与服务器运行的操作系统有关?
另外我在另一台服务器上测试了相同的程序,该服务器上有7个双核心AMD Opteron(tm)处理器8214并运行Linux版本2.6.18-194.3.1.el5。那里的时间是我所期望的。时间从1(最大)到8(最小执行时间)开始变小。
该程序实现了正确的生命游戏,都使用pthreads和openmp,我只是不知道为什么时间就像我发布的例子。所以最后,我的问题是:
1)系统中可以同时运行的线程数取决于cpus的内核?它只依赖于cpus,尽管每个cpu都有多个内核?它取决于以前的所有操作系统?
2)它是否与我将1000x1000数组分配给线程数的方式有关?但是如果我做了那么openmp代码不会给出相同的时间模式?
3)什么原因我可能会得到这样的定时?
请原谅我的英语我来自欧洲... thnx在advanse。
编辑: 这是我使用OpenMP使用的代码:
#define Row 1000+2
#define Col 1000+2 int num; int (*temp)[Col]; int (*a1)[Col]; int (*a2)[Col];
int main() {
int i,j,l,sum;
int array1[Row][Col],array2[Row][Col];
struct timeval tim;
struct tm *tm;
double start,end;
int st,en;
for (i=0; i<Row; i++)
for (j=0; j<Col; j++)
{
array1[i][j]=0;
array2[i][j]=0;
}
array1[3][16]=1;
array1[4][16]=1;
array1[5][15]=1;
array1[6][15]=1;
array1[6][16]=1;
array1[7][16]=1;
array1[5][14]=1;
array1[4][15]=1;
a1=array1;
a2=array2;
printf ("\nGive number of threads:");
scanf("%d",&num);
gettimeofday(&tim,NULL);
start=tim.tv_sec+(tim.tv_usec/1000000.0); omp_set_num_threads(num);
#pragma omp parallel private(l,i,j,sum)
{
printf("Number of Threads:%d\n",omp_get_num_threads());
for (l=0; l<100; l++)
{
#pragma omp for
for (i=1; i<(Row-1); i++)
{
for (j=1; j<(Col-1); j++)
{
sum=a1[i-1][j-1]+a1[i-1][j]+a1[i-1][j+1]+a1[i][j-1]+a1[i][j+1]+a1[i+1][j-1]+a1[i+1][j]+a1[i+1][j+1];
if ((a1[i][j]==1) && (sum==2||sum==3))
a2[i][j]=1;
else if ((a1[i][j]==1) && (sum<2))
a2[i][j]=0;
else if ((a1[i][j]==1) && (sum>3))
a2[i][j]=0;
else if ((a1[i][j]==0)&& (sum==3))
a2[i][j]=1;
else if (a1[i][j]==0)
a2[i][j]=0;
}//end of iteration J
}//end of iteration I
#pragma omp barrier
#pragma omp single
{
temp=a1;
a1=a2;
a2=temp;
}
#pragma omp barrier
}//end of iteration L
}//end of paraller region
gettimeofday(&tim,NULL);
end=tim.tv_sec+(tim.tv_usec/1000000.0);
printf("\nTime Elapsed:%.6lf\n",end-start);
printf("all ok\n");
return 0; }
的时间设置与OpenMP代码
7双核心CPU 使用1〜螺纹秒7.72,使用a)系统2个螺纹〜4,53秒,使用3根螺纹〜3,64秒,使用4根螺纹〜2,24秒,使用5〜2,02秒,使用6〜1,78秒,使用7〜1,59秒,使用8〜1,44秒
b)带有4个双核CPU的系统 使用1个线程〜9,06秒,使用2个螺纹~4,86秒,使用3个螺纹~3.49秒,使用4个螺纹~2.61秒,使用5〜3,98秒,使用6〜3,53秒,使用7〜3秒, 48秒,使用8〜3,32秒
以上是我得到的时间。
你好,thanx为答案。是的,我明白有数据依赖关系,但(解决它们超出了我的程序的目标)代码是这样的,当我在系统上测试它与4双核cpus(所以8核心)和系统有7双核Cpus的数据依赖性和缓存抖动和更新策略是相同的,每个缓存大小并没有改变。但是对于具有7个双核CPU的系统,我得到了我期望的时序,但是与其他具有8个内核的系统(并且我使用的线程的最大数量仍然是8)相比,当我使用4个线程时最小的执行时间。 – stois21 2010-07-26 16:16:33