Почему я не вижу смесь потоков, выполняющих цикл for - PullRequest
1 голос
/ 15 февраля 2012

Я установил количество потоков на 4.

Моя проблема в том, что я вижу поведение последовательного типа в следующем коде. Я хотел бы видеть, как все потоки печатают свои идентификаторы случайным образом, как поведет себя реализация pthread.

#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
#define CHUNKSIZE 5
#define N 1000

int main (int argc, char *argv[]) 
{
   int nthreads, tid, i, chunk;
   float a[N], b[N], c[N];

   /* Some initializations */
   for (i=0; i < N; i++)
     a[i] = b[i] = i * 1.0;
   chunk = CHUNKSIZE;

   #pragma omp parallel for schedule(static,10) shared(a,b,c) private(i,tid)
   for (i=0; i<N; i++)
   {
      tid = omp_get_thread_num();
      c[i] = a[i] + b[i];
      printf("Thread %d: c[%d]= %f\n",tid,i,c[i]);
   }
}

Вывод из раздела:

Thread 2: c[949]= 1898.000000
Thread 2: c[980]= 1960.000000
Thread 2: c[981]= 1962.000000
Thread 2: c[982]= 1964.000000
Thread 2: c[983]= 1966.000000
Thread 2: c[984]= 1968.000000
Thread 2: c[985]= 1970.000000
Thread 2: c[986]= 1972.000000
Thread 2: c[987]= 1974.000000
Thread 2: c[988]= 1976.000000
Thread 2: c[989]= 1978.000000
Thread 0: c[1]= 2.000000
Thread 0: c[2]= 4.000000
Thread 0: c[3]= 6.000000
Thread 0: c[4]= 8.000000
Thread 0: c[5]= 10.000000
Thread 0: c[6]= 12.000000
Thread 0: c[7]= 14.000000
Thread 0: c[8]= 16.000000
Thread 0: c[9]= 18.000000
Thread 0: c[40]= 80.000000
Thread 0: c[41]= 82.000000
Thread 0: c[42]= 84.000000
Thread 0: c[43]= 86.000000
Thread 0: c[44]= 88.000000
Thread 0: c[45]= 90.000000
Thread 0: c[46]= 92.000000
Thread 0: c[47]= 94.000000
Thread 0: c[48]= 96.000000
Thread 0: c[49]= 98.000000
Thread 0: c[80]= 160.000000
Thread 0: c[81]= 162.000000
Thread 0: c[82]= 164.000000
Thread 0: c[83]= 166.000000
Thread 0: c[84]= 168.000000
Thread 0: c[85]= 170.000000
Thread 0: c[86]= 172.000000
Thread 0: c[87]= 174.000000
Thread 0: c[88]= 176.000000
Thread 0: c[89]= 178.000000
Thread 0: c[120]= 240.000000
Thread 0: c[121]= 242.000000
Thread 0: c[122]= 244.000000
Thread 0: c[123]= 246.000000

1 Ответ

0 голосов
/ 15 февраля 2012

Ваша машина одноядерная? Если это так, потоки, вероятно, порождаются последовательно, и ваша ОС использует циклическое планирование для выполнения каждого потока. Вы увидите чередующиеся потоки только на многоядерных компьютерах.

EDIT:

В соответствии с моим комментарием ниже, я думаю, что вы хотите увидеть случайность выполнения потока, а это не тот случай, в зависимости от вашего планировщика ОС.

В действительности многопоточность на одноядерной машине не очень полезна. Параллелизм с двумя потоками может дать вам небольшое повышение производительности, но вы получите уменьшенную отдачу, а накладные расходы на разветвления и объединения быстро приведут к снижению производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...