Почему OpenMP не ускоряет мою C программу? - PullRequest
0 голосов
/ 25 марта 2020

Я новичок в 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 дважды перед проверкой. Как мне предотвратить это?
...