CUDA数组到数组和

CUDA数组到数组和,cuda,parallel-processing,Cuda,Parallel Processing,我有一段简短的代码如下: 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; doubl

我有一段简短的代码如下:

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++;
}
typedef结构{
双sX;
双重sY;
双vX;
双vY;
int-rX;
智力;
整数质量;
int种;
int-boxnum;
}粒子;
类型定义结构{
双mX;
加倍我的爱;
重复计数;
int rotDir;
双cX;
双y;
int superDir;
}盒子;
//....
int i;

对于(i=0;i您可以尝试使用
atomicAdd
操作来修改您的Box数组。全局内存上的原子操作非常缓慢,但同时,由于两个原因,不可能进行涉及共享内存的任何优化:

  • 假设粒子的属性
    boxnum
    particles[0]…particles[n]
    没有顺序,并且不位于任何小边界(在块大小的范围内),您无法预测将哪些框从全局内存加载到共享内存中。您必须首先收集所有的boxnum
  • 如果您试图收集所有boxnumber,则无法使用包含所有可能boxnumber的数组作为索引,因为有太多的框无法放入共享内存。因此,您必须使用队列收集索引(通过数组、指向下一个可用插槽的指针和原子操作实现),但仍然会有冲突,因为同一个箱号可能会在队列中多次出现

  • 结论:
    atomicAdd
    将至少为您提供正确的行为。请尝试并测试性能。如果您对性能不满意,请考虑是否有其他方法来执行相同的计算,从而从共享内存中获益。

    作为替代方法,您可以启动块的二维网格

    blocks.x=numParticles/threadsPerBlock/repeatPerBlock

    blocks.y=numoboxs/1024

    当且仅当boxnum位于1024*blockIdx.y和1024*(blockIdx.y+1)之间时,每个块在共享内存中执行原子加法

    接下来是沿blocks.x进行的缩减

    这可能比atomicAdd-on全局内存快,也可能不快,因为数据的读取次数为.y块。但是,如果“粒子”在排序过程中按boxnum排序,然后是分区过程,则这可能是固定的


    可能还有其他几种方法可以做到这一点,但由于问题大小变化很大,您可能最终不得不编写2-3种针对给定大小范围进行优化的不同方法。

    particle.boxnum值是如何分布的?如果您从存储的粒子访问particle.boxnum,boxnum是否也会连续?随机的。我想我可能需要重写这个东西的一些基本结构,以便我对它有更多的了解(例如,对粒子列表进行排序以确保条件)。好的,谢谢。我担心我可能需要做类似的事情,但不确定具体如何做。