Я запускаю программу на сервере в моем университете, который имеет 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. Я рассчитал параллельную часть программы, используя функцию getimeofday (), используя 1-8 потоков. Но время не кажется правильным. Я получаю самое большое время, используя 1 поток (как и ожидалось), тогда время становится меньше. Но самое маленькое время, которое я получаю, это когда я использую 4 потока.
Вот пример, когда я использую массив 1000x1000.
Использование 1 потока ~ 9,62 с, Использование 2 потоков ~ 4,73 с, Использование 3 ~ 3,64 с, Использование 4 ~ 2,99 с, Использование 5 ~ 4,19 с, Использование 6 ~ 3,84, Использование 7 ~ 3,34 , Используя 8 ~ 3.12.
Вышеуказанные моменты времени, когда я использую pthreads. Когда я использую openmp, сроки меньше, но следуют той же схеме.
Я ожидал, что время сократится с 1 до 8 из-за четырехъядерного процессора? Я думал, что, поскольку есть 4 процессора с 2 ядрами в каждом, 8 потоков могут работать одновременно. Связано ли это с операционной системой, на которой работает сервер?
Также я тестировал те же программы на другом сервере, который имеет 7 двухъядерных процессоров AMD Opteron (tm) 8214 и работает под управлением Linux версии 2.6.18-194.3.1.el5. Там время, которое я получаю, это то, что я ожидал. Время уменьшается с 1 (самое большое) до 8 (самое маленькое время выполнения).
Программа правильно реализует Game of Life, используя как pthreads, так и openmp, я просто не могу понять, почему сроки похожи на пример, который я опубликовал. Итак, в заключение, мои вопросы:
1) Количество потоков, которые могут одновременно выполняться в системе, зависит от ядер процессора? это зависит только от процессора, хотя каждый процессор имеет более одного ядра? Это зависит от всех предыдущих и операционной системы?
2) Это связано с тем, как я делю массив 1000x1000 на количество потоков? Но если бы я это сделал, то код openmp не дал бы такой же шаблон времени?
3) По какой причине я могу получить такие сроки?
Это код, который я использую с 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 двухъядерными процессорами
Использование 1 потока ~ 7,72 с, Использование 2 потоков ~ 4,53 с, Использование 3 потоков ~ 3,64 с, Использование 4 потоков ~ 2,24 с, Использование 5 ~ 2,02 с, Использование 6 ~ 1,78 сек, используя 7 ~ 1,59 сек, используя 8 ~ 1,44 сек
б) Система с 4 двухъядерными процессорами
Использование 1 потока ~ 9,06 с, Использование 2 потоков ~ 4,86 с, Использование 3 потоков ~ 3,49 с, Использование 4 потоков ~ 2,61 с, Использование 5 ~ 3,98 с, Использование 6 ~ 3,53 сек, используя 7 ~ 3,48 сек, используя 8 ~ 3,32 сек
Выше время, которое я получаю.