English 中文(简体)
是否值得? 是否有更好的选择?
原标题:Is SIMD Worth It? Is there a better option?

我有一些守则运作良好,但我想使其运作更好。 我所面对的主要问题是,它需要一个通道。 外部是循环(必须按序进行),内侧是每个考虑的微粒。 我知道,我对外事做的事情不多,但我很想知道,是否有办法优化诸如:

    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个实验。

我认为,我的问题是,是否有办法处理这些长途的病媒,其效率比只是通过这些媒介。 我觉得应该这样,但我可以认为。

最佳回答

我不敢肯定SIMD会带来多少好处;内 lo是很小和简单,因此我猜想(通过看看看看)你可能比任何其他东西都更有记忆力。 考虑到这一点,我试图重写 lo体的主要部分,不要触及微粒阵列比需要多:

const double temp_vX = particles[i].vX - boxes[boxnum].mX;
const double temp_vY = particles[i].vY - boxes[boxnum].mY;

if(boxes[boxnum].rotDir == 1)
{
    nX = temp_vX*Wxx+temp_vY*Wxy;
    nY = temp_vX*Wyx+temp_vY*Wyy;
}
else
{
    //to make it randomly pick a rot. direction
    nX =  temp_vX*Wxx-temp_vY*Wxy;
    nY = -temp_vX*Wyx+temp_vY*Wyy;
}   
particles[i].vX = nX;
particles[i].vY = nY;

如果没有在最后增加额外资金,这种可能性很小。


另一种可能的速度是使用微粒阵列上的_restrict,从而使汇编者能够更好地优化对电流的书写。 而且,如果Wxx等人是全球变量,他们可能必须每次通过坡道重载,而不是可能储存在登记册上;使用<代码> 限制性。 这也将有助于实现这一目标。


由于您能够重新获取微粒,你可以尝试预选(例如: builtin_prefetch)几个微粒,以减少ache。 箱子上的排位比较困难,因为你以无法预测的顺序重新使用这些箱子。

int nextBoxnum = ((((int)(particles[i+1].sX+boxShiftX) /// etc...
// prefetch boxes[nextBoxnum]

我刚刚注意到的最后一个问题——如果是盒子:旋转: 迪尔总是+/-1.0,因此,你可以消除 like体中的比较和分支,如:

const double rot = boxes[boxnum].rotDir; // always +/- 1.0
nX =     particles[i].vX*Wxx + rot*particles[i].vY*Wxy;
nY = rot*particles[i].vX*Wyx +     particles[i].vY*Wyy;

自然,在申请之前和之后,通常都会有剖面图。 但我认为,所有这些都可能有所帮助,无论你是否转而加入《千年发展目标》。

问题回答

就在记录上,还有圣经会。

rel=“nofollow noreferer”>http://simdx86.sourceforge.net/Modules.html

(关于编辑你也可以尝试:gcc-O3 -msse2或类似)。

((int)(particles[i].sX+boxShiftX))/BOX_SIZE

如果X是暗中(可查t)。 Truncate BoxShiftX/Y to an int before into the loop.

你们是否有足够的描述来告诉你该职能中花费的时间?

例如,你是否确信,在计算时间的盒子中,它不是你的iv和 mo? 有时编篡人没有发现可能的转移/替代物,即使一个人(或至少是知道BOX_SIZE和BWIDTH/BHELI的人,我没有这样做)也能够这样做。

花费大量时间,帮助消除法典的错误界限是合情合理的。

或许值得研究的另一件事情是,如果能够把工作胁迫到能够与IPP这样的图书馆合作的东西,后者将就如何最好地利用处理器作出知情的决定。

你的算法有太多的记忆、分类和分支指示,足以从SIMD中获利。 管道将持续停顿。

找到一种更有效的随机化方法,将是名单的首位。 之后,试图在浮或暗中工作,但并非两者兼有。 改写条件为算术,或至少是选定操作。 只有到那时,SIMD才成为现实的主张。





相关问题
Fastest method for running a binary search on a file in C?

For example, let s say I want to find a particular word or number in a file. The contents are in sorted order (obviously). Since I want to run a binary search on the file, it seems like a real waste ...

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

Tips for debugging a made-for-linux application on windows?

I m trying to find the source of a bug I have found in an open-source application. I have managed to get a build up and running on my Windows machine, but I m having trouble finding the spot in the ...

Trying to split by two delimiters and it doesn t work - C

I wrote below code to readin line by line from stdin ex. city=Boston;city=New York;city=Chicago and then split each line by ; delimiter and print each record. Then in yet another loop I try to ...

Good, free, easy-to-use C graphics libraries? [closed]

I was wondering if there were any good free graphics libraries for C that are easy to use? It s for plotting 2d and 3d graphs and then saving to a file. It s on a Linux system and there s no gnuplot ...

Encoding, decoding an integer to a char array

Please note that this is not homework and i did search before starting this new thread. I got Store an int in a char array? I was looking for an answer but didn t get any satisfactory answer in the ...

热门标签