【发布时间】:2018-02-21 00:44:00
【问题描述】:
所以我试图模拟一个名为 Tasep 的一维物理模型。
我用 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;
}
我会非常感谢愿意提供帮助和建议的人。
【问题讨论】: