Я не могу векторизовать этот код
. Заданная информация - векторизация 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;
}