Я пытаюсь сравнить вычисление f(x)
, меняя количество потоков на каждой итерации.
f(x) = c * ln(x) * cos(x)
n=10000000
for (int pp = 2; pp<17; pp++)
{
p = pp;
int chunk = n/p; //acts like floor
omp_set_num_threads(p);
double start_parallel = omp_get_wtime();
//start parallel
#pragma omp parallel shared(tt,chunk) private (i)
{
//printf("thread number %d\n",omp_get_thread_num());
#pragma omp for schedule(dynamic,chunk) nowait
for(i=0; i<n; i++)
{
//tt[i] = f(tt[i]);
tt[i] = f1(tt[i]); //the speed up is much higher with f1 since log and cos
//computations are polynomial; see function.
}
} //end parallel
double end_parallel = omp_get_wtime();
double cpu_time_used_parallel = (double) (end_parallel - start_parallel);
printf("parallel: for n=%d, p=%d, time taken=%f, speedup=%f\n",
n,p,cpu_time_used_parallel,
cpu_time_used_seq/cpu_time_used_parallel);
}
Результат:
Начал менять темы:
параллельно: для n=10000000, p=2, затраченное время=0,153774, ускорение=3,503831
параллельно: для n=10000000, p=3, затраченное время=0,064447, ускорение=8,360370
параллельно: для n=10000000, p=4, затраченное время=0,044694, ускорение=12,055239
параллельно: для n=10000000, p=5, затраченное время=0,048700, ускорение=11,063550
параллельно: для n=10000000, p=6, затраченное время=0,039009, ускорение=13,811989
параллельно: для n=10000000, p=7, затраченное время=0,041735, ускорение=12,910017
параллельно: для n=10000000, p=8, затраченное время=0,041268, ускорение=13,055919
параллельно: для n=10000000, p=9, затраченное время=0,039032, ускорение=13,804157
параллельно: для n=10000000, p=10, затраченное время=0,038970, ускорение=13,825767
параллельно: для n=10000000, p=11, затраченное время=0,039843, ускорение=13,522884
параллельно: для n=10000000, p=12, затраченное время=0,041356, ускорение=13,028237
параллельно: для n=10000000, p=13, затраченное время=0,041039, ускорение=13,128763
параллельно: для n=10000000, p=14, затраченное время=0,047433, ускорение=11,359218
параллельно: для n=10000000, p=15, затраченное время=0,048430, ускорение=11,125202
параллельно: для n=10000000, p=16, затраченное время=0,051950, ускорение=10,371477
Примечание. Ускорение здесь вычисляется по последовательному алгоритму (потоки = 1).
Изменение p
(количество потоков) не влияет на ускорение.
Правильно ли я делаю это, или причина связана с неэффективным увеличением количества потоков (т.е. теоретически изменение p
серьезно не повлияет на O(myprogram)
)?