Я новичок в OpenMP, и я пытался использовать его для ускорения моей программы C (с GMP). Приведенный ниже код представляет собой тест на простоту , который я сделал:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <math.h>
#include <omp.h>
#include <gmp.h>
int lucas_lehmer(unsigned long int p) {
mpz_t M, s, t;
// Let M = 2^p - 1
mpz_init_set_ui(t, p);
mpz_init(M);
mpz_setbit(M, p);
mpz_sub_ui(M, M, 1);
unsigned long int I;
mpz_init_set_ui(s, 4);
#pragma omp parallel for
{
for (i = 3; i <= p; i++) {
printf("Processed: %d\n", i-3);
mpz_mul(s, s, s);
mpz_sub_ui(s, s, 2);
/* mpz_mod(s, s, mp) but more efficiently done gisen mod 2^p-1 */
if (mpz_sgn(s) < 0) mpz_add(s, s, M);
/* while (n > mp) { n = (n >> p) + (n & mp) } if (n==mp) n=0 */
/* but in this case we can hase at most one loop plus a carry */
mpz_tdiv_r_2exp(t, s, p);
mpz_tdiv_q_2exp(s, s, p);
mpz_add(s, s, t);
#pragma omp parallel
{
while (mpz_cmp(s, M) >= 0) mpz_sub(s, s, M);
}
}
}
int res;
res = !mpz_sgn(s);
mpz_clear(t); mpz_clear(M); mpz_clear(s);
return res;
}
int main() {
unsigned long int p;
printf("Enter an exponent:");
scanf("%d", &p);
int boolean;
boolean = lucas_lehmer(p);
if (lucas_lehmer(p)) {
printf("\nPrime number: True\n");
}
else {
printf("\nPrime number: False\n");
}
system("pause");
return 0;
}
Я добавил #pragma omp parallel for
и #pragma omp parallel
, чтобы увидеть, улучшается ли производительность программы.
После того, как я скомпилировал команду g++ lucas_lehmer.c -lgmp -I C:/gmp-6.2.0/include/ -L C:/gmp-6.2.0/lib/
(я использую MinGW-MSYS), по сравнению с моим кодом без OpenMP я не обнаружил ускорения в своем коде. В чем здесь проблема? Как это исправить?
- Необязательный вопрос: похоже, в приведенном выше коде проблема с l oop. Повторяет l oop дважды перед проверкой. Как мне предотвратить это?