Multithreading 优化佛陀

Multithreading 优化佛陀,multithreading,c++11,fractals,stdthread,Multithreading,C++11,Fractals,Stdthread,我目前正在致力于我自己的Buddhabrot实现。到目前为止,我正在使用C++11中的std::thread-类来同时完成以下迭代: void iterate(float *res){ //generate starting point std::default_random_engine generator; std::uniform_real_distribution<double> distribution(-1.5,1.5); double ReC,ImC; double

我目前正在致力于我自己的Buddhabrot实现。到目前为止,我正在使用C++11中的
std::thread
-类来同时完成以下迭代:

void iterate(float *res){
//generate starting point
std::default_random_engine generator;
std::uniform_real_distribution<double> distribution(-1.5,1.5);

double ReC,ImC;
double ReS,ImS,ReS_;
unsigned int steps;

unsigned int visitedPos[maxCalcIter];

unsigned int succSamples(0);

//iterate over it
while(succSamples < samplesPerThread){
    steps = 0;
    ReC = distribution(generator)-0.4;
    ImC = distribution(generator);
    double p(sqrt((ReC-0.25)*(ReC-0.25) + ImC*ImC));
    while (( ((ReC+1)*(ReC+1) + ImC*ImC) < 0.0625) || (ReC < p - 2*p*p + 0.25)){
        ReC = distribution(generator)-0.4;
        ImC = distribution(generator);
        p = sqrt((ReC-0.25)*(ReC-0.25) + ImC*ImC);
    }
    ReS = ReC;
    ImS = ImC;
    for (unsigned int j = maxCalcIter; (ReS*ReS + ImS*ImS < 4)&&(j--); ){
        ReS_ = ReS;
        ReS *= ReS;
        ReS += ReC - ImS*ImS;
        ImS *= 2*ReS_;
        ImS += ImC;
        if ((ReS+0.5)*(ReS+0.5) + ImS*ImS < 4){
            visitedPos[steps] = int((ReS+2.5)*0.25*outputSize)*outputSize + int((ImS+2)*0.25*outputSize);

        }
        steps++;

    }
    if ((steps > minCalcIter)&&(ReS*ReS + ImS*ImS > 4)){
        succSamples++;
        for (int j = steps; j--;){
            //std::cout << visitedPos[j] << std::endl;
            res[visitedPos[j]]++;
        }
    }
}
}
void迭代(float*res){
//生成起点
std::默认随机引擎生成器;
标准:均匀实分布(-1.5,1.5);
双ReC,ImC;
双分辨率、即时消息、分辨率;
无符号整数步;
未签名整数visitedPos[maxCalcIter];
无符号整数采样(0);
//迭代
while(succSamples最小方解石)和&(ReS*ReS+ImS*ImS>4)){
数据样本++;
对于(int j=steps;j--;){

//std::cout你检查过
-O4
-O2
快吗?在O2以上,还不确定。 此外,如果此编译仅适用于您,请尝试
-march=native
。这将利用您特定的CPU体系结构,但生成的二进制文件可能会在较旧/不同的计算机上与SIGSEV一起崩溃


如果我看的没错,您没有显示任何线程。请确保您的线程没有写入同一缓存线的内存位置。从不同线程写入同一缓存线中的内存位置会强制CPU核心同步其缓存,这是一个巨大的性能降级。

它是否足够快以满足您的需要?如果是,则可读代码是无限可取的。所以,你的“优化代码”等同于“不可读代码”?好的代码应该是可读的,即使它已经过优化,除非你正在为各种模糊代码竞赛中的一个提交工作…@twalberg:我的意思是,当前的方法似乎相当幼稚,并且大多遵循人们想到的第一个实现。@AndyG:我更倾向于出于教育目的我想优化这段代码。单是速度就足以完成这项工作,但我想从一些有希望的有用建议中学到一些东西。@Labello:老实说,你可能在这方面运气更好,你说“相同的缓存线”到底是什么意思?在最后一个for循环中,所有访问的点在生成的映像中递增。此映像存储在一个指针中,它在不同线程之间共享。Labello:这看起来像是共享。避免线程写入相同的内存。(如果它们这样做,它们无论如何都应该同步)