Open MP занимает больше времени для алгоритма black_scholes в C - PullRequest
0 голосов
/ 01 мая 2018

У меня возникли проблемы с распараллеливанием этого фрагмента кода black_scholes, я добавил простую параллель #pragma omp, но это заняло в 50 раз больше времени Я уверен, что есть проблема с общей памятью, но я действительно не знаю, что

black_scholes_iterate (void* the_args)
{
  black_scholes_args_t* args = (black_scholes_args_t*) the_args;

/* Unpack the IN/OUT struct */

 /* IN (read-only) parameters */
 const int S = args->S;
const int E = args->E;
const int M = args->M;
const double r = args->r;
const double sigma = args->sigma;
const double T = args->T;

/* OUT (write-only) parameters */
double* trials = args->trials;
double mean = 0.0;

/* Temporary variables */
gaussrand_state_t gaussrand_state;
void* prng_stream = NULL; 
int k;

/* Spawn a random number generator */
prng_stream = spawn_prng_stream (0);

/* Initialize the Gaussian random number module for this thread */
init_gaussrand_state (&gaussrand_state);

/* Do the Black-Scholes iterations */
printf("here2: %d \n",M);


#pragma omp  parallel for
for (k = 0; k < M; k++)
  {
    const double gaussian_random_number = gaussrand1 (&uniform_random_double,
                        prng_stream,
                        &gaussrand_state);
    trials[k] = black_scholes_value (S, E, r, sigma, T, 
                   gaussian_random_number);

  /*
   * We scale each term of the sum in order to avoid overflow. 
   * This ensures that mean is never larger than the max
   * element of trials[0 .. M-1].
   */
  mean += trials[k] / (double) M;
}

после дальнейшего тестирования я заметил, что эта часть цикла for занимает много времени: const double gaussian_random_number = gaussrand1 (&iform_random_double, prng_stream, & gaussrand_state);

1 Ответ

0 голосов
/ 02 мая 2018
double *a;
a = malloc(M * sizeof (double));

for (int k = 0; k < M; k++)
{

  const double gaussian_random_number = gaussrand1 (&uniform_random_double,
                        prng_stream,
                        &gaussrand_state);
  a[k]=gaussian_random_number;

}
#pragma omp  parallel for 
   for (int k = 0; k < M; k++)
{

  trials[k] = black_scholes_value (S, E, r, sigma, T, 
                   a[k]);




  mean += trials[k] / (double) M;
}

@ Z Ответ Босона был решением, я значительно ускорился, и это очень помогло большое спасибо

...