#include #include #include #include #include #include "omp.h" //#define __IZPIS_ #define N 1024*1024*32 #define NTHREADS 64 int vsote_deliteljev[N]; int vsota_deliteljev(int x); static inline void isci_prijatelje(); static inline void isci_prijatelje_dyn(); double cas; unsigned int stevilo_prijateljev = 0; 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(){ /* S E R I J S K O */ stevilo_prijateljev = 0; omp_set_num_threads(1); cas = omp_get_wtime(); isci_prijatelje(); cas = omp_get_wtime() - cas; printf("SER: Stevilo prijateljev %d Cas izvajanja: %f \n", stevilo_prijateljev, cas); /* P A R A L E L N O S T A T I C */ stevilo_prijateljev = 0; omp_set_num_threads(8); cas = omp_get_wtime(); isci_prijatelje(); cas = omp_get_wtime() - cas; printf("PS: Stevilo prijateljev: %d, Cas izvajanja: %f \n", stevilo_prijateljev, cas); /* P A R A L E L N O D Y N A M I C */ stevilo_prijateljev = 0; omp_set_num_threads(8); cas = omp_get_wtime(); isci_prijatelje_dyn(); cas = omp_get_wtime() - cas; printf("PD: Stevilo prijateljev: %d, Cas izvajanja: %f \n", stevilo_prijateljev, cas); return 0; } static inline void isci_prijatelje(){ //int sdi; #pragma omp parallel for for (int x = 1; x < N; x++) { vsote_deliteljev[x] = vsota_deliteljev(x); } #pragma omp parallel { int sdi; #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){ #ifdef __IZPIS_ printf("Prijateljski števili: %d in %d \n", i, sdi); #endif stevilo_prijateljev ++; } } } } } } static inline void isci_prijatelje_dyn(){ //int sdi; #pragma omp parallel for schedule(dynamic, 128*128) for (int x = 1; x < N; x++) { vsote_deliteljev[x] = vsota_deliteljev(x); } #pragma omp parallel { int sdi; #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){ #ifdef __IZPIS_ printf("Prijateljski števili: %d in %d \n", i, sdi); #endif stevilo_prijateljev ++; } } } } } }