提前退出 GPU 上的循环是否值得?
is early exit of loops on GPU worth doing?
我们编写了 GLSL 着色器代码以使用 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;
}
}
GPU的调度单位是warp/wavefront。通常是连续的 32 或 64 个线程组。 warp 的执行时间是该 warp 内所有线程执行时间的最大值。
因此,如果您的提前退出可以使整个 warp 更快终止(例如,如果线程 0 到 31 全部 采取提前退出),那么是的,这是值得的,因为硬件可以安排另一个 warp 来执行,这减少了整个内核 运行 时间。否则,它可能不是,因为即使线程 1 到 31 提前退出,warp 仍然占用硬件,直到线程 0 完成。
我们编写了 GLSL 着色器代码以使用 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;
}
}
GPU的调度单位是warp/wavefront。通常是连续的 32 或 64 个线程组。 warp 的执行时间是该 warp 内所有线程执行时间的最大值。
因此,如果您的提前退出可以使整个 warp 更快终止(例如,如果线程 0 到 31 全部 采取提前退出),那么是的,这是值得的,因为硬件可以安排另一个 warp 来执行,这减少了整个内核 运行 时间。否则,它可能不是,因为即使线程 1 到 31 提前退出,warp 仍然占用硬件,直到线程 0 完成。