Может кто-то векторизовать функцию diffusion () - PullRequest
0 голосов
/ 24 сентября 2019

Я не могу векторизовать этот код

. Заданная информация - векторизация diffusion ()

. Рабочая нагрузка диффузии имеет истинную зависимость вектора от временных интервалов, поэтому эту рабочую нагрузку нельзя векторизовать.по временным шагам.Одним из решений этой проблемы является реализация цикла-обмена, чтобы сделать цикл частиц внутренним циклом.

Чтобы реализовать обмен, вы должны создать временный буфер для хранения позиций частиц.Кроме того, генератор случайных чисел не может быть в векторизованном цикле.Таким образом, вы должны генерировать и хранить несколько случайных чисел перед векторизованным циклом.Вы можете генерировать случайные числа из n_частиц с помощью:

float rn[n_particles];
vsRngUniform(VSL_RNG_METHOD_UNIFORM_STD,
             rnStream, n_particles, rn, -1.0, 1.0);

Данный код для векторизации:

int diffusion(
     const int n_particles,     // num of particles
     const int n_steps,         // num of timesteps
     const float x_threshold,   // x cutoff
     const float alpha,         // for dist_func
     VSLStreamStatePtr rnStream // RNG
    ) {
  int n_escaped=0;
  for (int i = 0; i < n_particles; i++) {
    float x = 0.0f;
    for (int j = 0; j < n_steps; j++) {
      float rn;
      // Intel(R) MKL RNG
      vsRngUniform(VSL_RNG_METHOD_UNIFORM_STD,
                   rnStream, 1, &rn, -1.0, 1.0);
      x += dist_func(alpha, rn); 
    }
    if (x > x_threshold) n_escaped++;
  }
  return n_escaped; 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...