在OpenGL上的GPU上"Intrinsics"可能吗?



我有了一个"内在的东西"的想法。在OpenGL上,但谷歌周围没有结果。

所以基本上我有一个Compute Shader来计算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-intrinsics)。但我的代码似乎比float版本运行得慢得多。仍然有一些错误在那里(如果有人仍然想看到的代码,请说出来),但我不认为他们是什么减慢代码。在我长时间地尝试之前,谁能马上告诉我,这种努力是否徒劳?

cpu和gpu的工作方式完全不同。

cpu需要在机器码中显式向量化,要么由程序员手动编码(通过你所谓的"cpu内部"),要么由编译器自动向量化。

gpu,另一方面,矢量化通过运行多个调用你的着色器(又名内核)在他们的核心并行。

我知道,在现代gpu上,线程内的额外矢量化既不需要也不支持:而不是制造单个内核,每个时钟可以添加4个浮点数(例如),拥有四倍的简单内核更有益,每个内核都可以添加一个浮点数。这样,您仍然可以获得整个芯片相同的峰值FLOPS,同时即使在单个着色器代码无法矢量化时也可以充分利用电路。问题是,大多数代码,通过必要的方式,至少会有一些标量计算在其中。

底线是:很可能你的代码已经尽可能地从GPU中挤出了这个特定任务。

相关内容

  • 没有找到相关文章

最新更新