我有一些守则运作良好,但我想使其运作更好。 我所面对的主要问题是,它需要一个通道。 外部是循环(必须按序进行),内侧是每个考虑的微粒。 我知道,我对外事做的事情不多,但我很想知道,是否有办法优化诸如:
void collide(particle particles[], box boxes[],
double boxShiftX, double boxShiftY) {/*{{{*/
int i;
double nX;
double nY;
int boxnum;
for(i=0;i<PART_COUNT;i++) {
boxnum = ((((int)(particles[i].sX+boxShiftX))/BOX_SIZE)%BWIDTH+
BWIDTH*((((int)(particles[i].sY+boxShiftY))/BOX_SIZE)%BHEIGHT));
//copied and pasted the macro which is why it s kinda odd looking
particles[i].vX -= boxes[boxnum].mX;
particles[i].vY -= boxes[boxnum].mY;
if(boxes[boxnum].rotDir == 1) {
nX = particles[i].vX*Wxx+particles[i].vY*Wxy;
nY = particles[i].vX*Wyx+particles[i].vY*Wyy;
} else { //to make it randomly pick a rot. direction
nX = particles[i].vX*Wxx-particles[i].vY*Wxy;
nY = -particles[i].vX*Wyx+particles[i].vY*Wyy;
}
particles[i].vX = nX + boxes[boxnum].mX;
particles[i].vY = nY + boxes[boxnum].mY;
}
}/*}}}*/
我审视了SIMD,尽管我可以找到很多东西,但我并不完全相信,适当提取和包装数据所需的处理将比作许多指示的一半有好处,因为现在只能使用两倍。
我试图把这段话打成多条read子,并用hm子和read子(使不同的阶段同步进行,而上述法典就是其中的一个阶段),但只是使其放慢。
我目前的法典相当迅速;其顺序是每10M微粒的二分之一,而从我从水泥中可以告诉的,我30%的时间仅用于这一功能(5 000次电话;Part_COUNT=8192微粒为1.8秒)。 我不想干小、持续的时间,仅仅看看512K微粒 * 50K变异,过去一个多星期里有1 000个实验。
我认为,我的问题是,是否有办法处理这些长途的病媒,其效率比只是通过这些媒介。 我觉得应该这样,但我可以认为。