【发布时间】:2011-02-19 23:32:24
【问题描述】:
我有这样一小段代码:
typedef struct {
double sX;
double sY;
double vX;
double vY;
int rX;
int rY;
int mass;
int species;
int boxnum;
} particle;
typedef struct {
double mX;
double mY;
double count;
int rotDir;
double cX;
double cY;
int superDir;
} box;
//....
int i;
for(i=0;i<PART_COUNT;i++) {
particles[i].boxnum = ((((int)(particles[i].sX+boxShiftX))/BOX_SIZE)%BWIDTH+BWIDTH*((((int)(particles[i].sY+boxShiftY))/BOX_SIZE)%BHEIGHT));
}
for(i=0;i<PART_COUNT;i++) {
//sum the momenta
boxnum = particles[i].boxnum;
boxes[boxnum].mX += particles[i].vX*particles[i].mass;
boxes[boxnum].mY += particles[i].vY*particles[i].mass;
boxes[boxnum].count++;
}
现在,我想将它移植到 CUDA。第一步很简单;将计算分散到一堆线程中是没有问题的。问题是第二个。由于任何两个粒子在任何同一个盒子中的可能性都相同,因此我不确定如何对其进行分区以避免冲突。
粒子数在 10,000 到 10,000,000 之间,盒子的数量在 1024 到 1048576 之间。
想法?
【问题讨论】:
-
particle.boxnum 值是如何分布的?如果您从随后存储的粒子中访问particle.boxnum,那么boxnumbers 是否也是连续的?
-
随机。我在想我可能不得不重写这个东西的一些基本结构,以便我对它有更多的了解(例如,对那个粒子列表进行排序以确保这个条件)。