“内部函数”可以在OpenGL的GPU上实现吗?

5t7ly7z5  于 2023-01-02  发布在  其他
关注(0)|答案(1)|浏览(155)

我有一个想法,在OpenGL上做一些“类似于intrinsic-like”的东西,但是在谷歌上搜索没有结果。
所以基本上我有一个计算着色器来计算Mandelbrot集(每个线程处理一个像素)。GLSL中我的main函数的一部分如下所示:

float XR, XI, XR2, XI2, CR, CI;
uint i;
CR = float(minX + gl_GlobalInvocationID.x * (maxX - minX) / ResX);
CI = float(minY + gl_GlobalInvocationID.y * (maxY - minY) / ResY);
XR = 0;
XI = 0;
for (i = 0; i < MaxIter; i++)
{
    XR2 = XR * XR;
    XI2 = XI * XI;
    XI = 2 * XR * XI + CI;
    XR = XR2 - XI2 + CR;
    if ((XR * XR + XI * XI) > 4.0)
    {
        break;
    }
}

所以我的想法是使用vec4的,而不是floats,这样做4计算/像素一次,并希望获得4倍的速度提升(类似于“真实的的”CPU内部函数)。但是我的代码似乎比float版本运行得慢得多。仍然有一些错误(如果有人还想看代码,请说出来),但我不认为它们是减慢代码的原因。在我尝试了很久之前,有人能马上告诉我,如果这种努力是徒劳的吗?

ccgok5k5

ccgok5k51#

CPU和GPU的工作原理完全不同。
CPU需要在机器码中进行显式矢量化,要么由程序员显式编码(通过所谓的“CPU-intrisnics”),要么由编译器自动矢量化。
另一方面,GPU通过在其内核上运行着色器(又名内核)的多次调用来进行矢量化。
AFAIK,在现代GPU上,线程内的额外矢量化既不需要也不受支持:代替制造可以一次添加4个浮子的单个芯(例如),拥有四倍数量的更简单的内核(每个内核每次可以操作一个浮点数)会更有好处。更好的原因是,对于处理向量的代码,无论哪种方式,你仍然可以获得相同的吞吐量。然而,对于处理标量的代码,实现矢量指令的额外电路不会被浪费。相反,因为它在多个内核之间分离,它将能够执行着色器的多个示例。大多数代码,出于必要,将至少有 * 一些 * 标量计算在其中。
底线是,您的代码已经很可能最大限度地利用GPU资源。

相关问题