所以我想模拟一个名为Tasep的一维物理模型。蒙特卡罗与费率,系统模拟与CUDA C++
我写了一个代码来模拟C++中的这个系统,但我绝对需要提升性能。
该模型非常简单(下面的C++代码) - 1
和0
的数组。 1
代表颗粒并且0
是无颗粒,意思是空的。一个粒子向右移动一个元素,速度为1
,如果该元素为空。最后一个位置的粒子将以beta
(比如0.3)的速度消失。最后,如果第一个位置是空的,则粒子将出现在那里,速率为alpha
。
一个线程很容易,我只是随机选取一个元素,并按照上面所述的概率1/alpha/beta
进行操作。但是这可能需要很长时间。
于是,我就做类似的事情有许多线程,使用GPU,并提出了很多问题:
使用GPU和CUDA在所有好主意,这样的事情?
我应该有多少个线程?我可以为每个网站有一个线程(
10E+6
),我应该吗?如何同步不同线程之间的内存访问?到目前为止我使用了原子操作。
生成随机数据的正确方法是什么?如果我使用一百万个线程,可以为每个线程分配一个随机生成器吗?
我该如何照顾利率?
我对CUDA很新。我设法从CUDA示例和一些教程运行代码。虽然我有一些上面的代码(虽然仍然给出了奇怪的结果),但我不把它放在这里,因为我认为这些问题更一般。
因此,这里是C++它的一个线程版本:
int Tasep()
{
const int L = 750000;
// rates
int alpha = 330;
int beta = 300;
int ProbabilityNormalizer = 1000;
bool system[L];
int pos = 0;
InitArray(system); // init to 0's and 1's
/* Loop */
for (int j = 0; j < 10*L*L; j++)
{
unsigned long randomNumber = xorshf96();
pos = (randomNumber % (L)); // Pick Random location in the the array
if (pos == 0 && system[0] == 0) // First site and empty
system[0] = (alpha > (xorshf96() % ProbabilityNormalizer)); // Insert a particle with chance alpha
else if (pos == L - 1) // last site
system[L - 1] = system[L - 1] && (beta < (xorshf96() % ProbabilityNormalizer)); // Remove a particle if exists with chance beta
else if (system[pos] && !system[pos + 1]) // If current location have a particle and the next one is empty - Jump right
{
system[pos] = false;
system[pos + 1] = true;
}
if ((j % 1000) == 0) // Just do some Loggingg
Log(system, j);
}
getchar();
return 0;
}
我会是谁愿意帮助非常感激,给他/她的意见。