#include #include #include #include #include #include "omp.h" #define N 1024*1024*4 #define NTHREADS 64 double cas; unsigned int stevilo_prijateljev = 0; int vsote_deliteljev[N]; static inline void isci_prijatelje(); static inline void isci_prijatelje_dyn(); int vsota_deliteljev(int x); int vsota_deliteljev(int x){ int vsota = 1; for (int i = 2; i <= sqrt(x); i++) { if ((x % i) == 0) { vsota = vsota + i ; if (x/i != i){ vsota = vsota + (x/i); } } } return vsota; } int main(){ omp_set_num_threads(1); stevilo_prijateljev = 0; cas = omp_get_wtime(); isci_prijatelje(); cas = omp_get_wtime() - cas; printf("SER: Čas izvajanja: %f sekund, stev prijateljev = %d \n", cas, stevilo_prijateljev); omp_set_num_threads(NTHREADS); stevilo_prijateljev = 0; cas = omp_get_wtime(); isci_prijatelje(); cas = omp_get_wtime() - cas; printf("PS: Čas izvajanja: %f sekund, stev prijateljev = %d \n", cas, stevilo_prijateljev); stevilo_prijateljev = 0; cas = omp_get_wtime(); isci_prijatelje_dyn(); cas = omp_get_wtime() - cas; printf("PD: Čas izvajanja: %f sekund, stev prijateljev = %d \n", cas, stevilo_prijateljev); return 0; } static inline void isci_prijatelje(){ #pragma omp parallel { int sdi; #pragma omp for for (int x = 1; x < N; x++) { vsote_deliteljev[x] = vsota_deliteljev(x); } #pragma omp for reduction(+:stevilo_prijateljev) for (int i = 1; i < N; i++) { sdi = vsote_deliteljev[i]; if (sdi < N) { if (i < sdi) { if (vsote_deliteljev[sdi] == i){ //printf("Prijateljski števili: %d in %d \n", i, sdi); stevilo_prijateljev ++; } } } } } } static inline void isci_prijatelje_dyn(){ #pragma omp parallel { int sdi; #pragma omp for schedule(dynamic, 128*128) for (int x = 1; x < N; x++) { vsote_deliteljev[x] = vsota_deliteljev(x); } #pragma omp for reduction(+:stevilo_prijateljev) for (int i = 1; i < N; i++) { sdi = vsote_deliteljev[i]; if (sdi < N) { if (i < sdi) { if (vsote_deliteljev[sdi] == i){ //printf("Prijateljski števili: %d in %d \n", i, sdi); stevilo_prijateljev ++; } } } } } }