Opengl es GPU上的循环是否值得提前退出?

Opengl es GPU上的循环是否值得提前退出?,opengl-es,glsl,webgl,shader,gpu,Opengl Es,Glsl,Webgl,Shader,Gpu,我们已经编写了GLSL着色器代码来使用GPU进行光线跟踪可视化。在光线行进循环中放置一个早期的出口中断似乎是相当标准的,因此如果光线熄灭,循环中断 但是从我对GPU代码的了解来看,每次渲染所花费的时间与最长的循环运行时间一样长。所以我的问题是:它值得提前退出吗 e、 g for(int i=0;i=光线长度| |累计阿尔法>=1.0){ 打破 } } GPU的调度单元是扭曲/波前。通常是32或64个线程的连续组。扭曲的执行时间是该扭曲内所有线程的最大执行时间 因此,如果您的提前退出可以使整个wa

我们已经编写了GLSL着色器代码来使用GPU进行光线跟踪可视化。在光线行进循环中放置一个早期的出口中断似乎是相当标准的,因此如果光线熄灭,循环中断

但是从我对GPU代码的了解来看,每次渲染所花费的时间与最长的循环运行时间一样长。所以我的问题是:它值得提前退出吗

e、 g

for(int i=0;i=光线长度| |累计阿尔法>=1.0){
打破
}
}

GPU的调度单元是扭曲/波前。通常是32或64个线程的连续组。扭曲的执行时间是该扭曲内所有线程的最大执行时间


因此,如果您的提前退出可以使整个warp提前终止(例如,如果线程0到31都提前退出),那么是的,这是值得的,因为硬件可以安排另一个warp执行,从而减少总体内核运行时间。否则,可能不是这样,因为即使线程1到31提前退出,在线程0完成之前,warp仍会占用硬件。

我不是100%了解这意味着什么——可能需要谷歌。基本上,这是一个开始跋涉的事情,对吗?哦,不,可能不会。因此,如果32/64线程中最慢的线程仍然提前退出,那么它会有所帮助,但如果不是,它不会?但是…据我所知,if语句也会降低GPU代码的速度。因此,如果退出意味着减少一条if语句,那么不提前退出是否值得呢?
if
语句不会减慢代码的速度,warp中的分支会减慢速度(当同一warp中的线程对分支谓词的求值不相同时)。提前退出对性能的影响为0,因为它不会减慢代码的其余部分:提前退出的线程只会被禁用。@nrob:Cicada提供的完美答案和注释。从本质上讲,GPU将处理n×m碎片(n和m因GPU而异,但通常在当前硬件的8到32之间)的块(扭曲/波前)中的像素。程序流程对于该块中的每个碎片都是相同的,如果在扭曲/波前内出现发散,则将采用任一路径。因此,如果一个扭曲/波前中只有一个碎片提前终止,那么你的收入将微乎其微。但是,如果你能使整个扭曲/波前提前终止,你就可以释放GPU内核和周期。@nrob:另一方面,人们在学习GPU原子计数器时首先做的事情之一是可视化光栅化模式(即GPU如何将碎片安排成扭曲/波前)。看这篇文章:谢谢大家-这很有帮助。
for(int i = 0; i < MAX_STEPS; i++){
        //Get the voxel intensity value from the 3D texture.    
        dataRGBA = getRGBAfromDataTex(dataTexture, currentPosition, dataShape, textureShape);

        // get contribution from the light
        lightRayPathRGBA = getPathRGBA(currentPosition, light.position, steps, tex); // this is the light absorbed so we need to take 1.0- to get the light transmitted
        lightRayRGBA = (vec4(1.0) - lightRayPathRGBA) * vec4(light.color, light.intensity);

        apparentRGB = (1.0 - accumulatedAlpha) * dataRGBA.rgb * lightRayRGBA.rgb * dataRGBA.a * lightRayRGBA.a;
        //apparentRGB = (1.0 - accumulatedAlpha) * dataRGBA.rgb * dataRGBA.a * lightRayRGBA.a;

        //Perform the composition.
        accumulatedColor += apparentRGB;
        //Store the alpha accumulated so far.
        accumulatedAlpha += dataRGBA.a;

        //Adva      nce the ray.
        currentPosition += deltaDirection;
        accumulatedLength += deltaDirectionLength;

        //If the length traversed is more than the ray length, or if the alpha accumulated reaches 1.0 then exit.
        if(accumulatedLength >= rayLength || accumulatedAlpha >= 1.0 ){
            break;
        }
    }