다음 코드는보다 1 개 스레드와 더 좋은 성능을 가진 느린 2 (4 개 스레드를 사용하는 것처럼, 속도 제공) : 내 노트북에2 개 스레드
#include <stdlib.h>
#include <stdio.h>
#include <omp.h>
int main(int argc, char **argv) {
int n = atoi(argv[1]);
int num_threads = atoi(argv[2]);
omp_set_num_threads(num_threads);
unsigned int *seeds = malloc(num_threads * sizeof(unsigned int));
for (int i = 0; i < num_threads; ++i) {
seeds[i] = 42 + i;
}
unsigned long long sum = 0;
double begin_time = omp_get_wtime();
#pragma omp parallel
{
unsigned int *seedp = &seeds[omp_get_thread_num()];
#pragma omp for reduction(+ : sum)
for (int i = 0; i < n; ++i) {
sum += rand_r(seedp);
}
}
double end_time = omp_get_wtime();
printf("%fs\n", end_time - begin_time);
free(seeds);
return EXIT_SUCCESS;
}
(2 코어
$ gcc -fopenmp test.c && ./a.out 100000000 1
0.821497s
$ gcc -fopenmp test.c && ./a.out 100000000 2
1.096394s
$ gcc -fopenmp test.c && ./a.out 100000000 3
0.933494s
$ gcc -fopenmp test.c && ./a.out 100000000 4
0.748038s
문제는 drand48_r
는 차이가 동적 스케줄링은 상황이 더 악화하지 않습니다 제공, 감소하지 않고 계속 : HT 나는 다음과 같은 결과를 얻을 수)를 활성화. 그러나 루프의 본문을 무작위로 연결되지 않은 무언가로 교체하면 i. 이자형. sum += *seedp + i;
, 모든 것이 예상대로 작동합니다.
아 :
대신 (테스트하지)이 하나를 시도! 나는 rand_r이 실제로 주어진 매개 변수를 수정하는 것을 생략했다. 좋은 대답 :) – Harald