OpenGL片段着色器:工作之间的计算时间有多大差异" 1通道的4倍" vs" 4个频道的1次"?

时间:2015-03-07 17:38:39

标签: opengl runtime fragment-shader gpu-programming

OpenGL片段着色器:处理“4通道1通道”与“1通道4通道”之间的计算时间有多大差异?

例如,我可以通过计算 每次1个频道, 我做了4次。

或者我可以将所有日期都放在4个频道中,并进行一次。

要考虑的一些事项: (a)一个片段着色器加载的一些重载, (b)1个通道的纹理提取时间几乎等于4个通道的纹理提取? 与着色器中的一次乘法相比,质感fetech的时间是多少? 如果纹理fetech的时间不多并且有很多计算步骤(包括很多乘法,加法等),那么我们就不需要考虑纹理时间了。

(c)计算时间有多大差异 4次漂浮a *浮动a 和1次vec4(a,a,a,a)* vec4(a,a,a,a)?

我确信“4通道的1次”比“1通道的4次”快 但我想知道它有多快。

我认为“4通道1通道”的原因是因为整个实现涉及多次通过。 例如,输入纹理1,渲染到纹理2.这意味着同时存在两个纹理。在我们计算纹理2之后,我们可以删除纹理1.因此我们需要一个额外的纹理用于GPU内存。 对于1通道,这意味着GPU存储器的1个通道的额外纹理。 对于4个通道,这意味着一个额外的4个通道纹理用于GPU内存。 所以这会造成空间差异。 (这只是一个简单的例子。真正的实现应该涉及更多的步骤)

我想平衡GPU内存和GPU计算时间之间的权衡。

对这些问题有任何想法或资源吗?

2 个答案:

答案 0 :(得分:0)

这不是很直接,取决于您的使用案例。如果您的输入数据是交错的,即正常的RGBA,则最有可能一次处理4个通道并且仅使用1个通道更好。如果您的数据是交错的,并且您一次处理一个通道,那么您将执行相同数量的计算,但是内存访问成本的4倍。原因是即使您只读取一个通道,仍然会加载所有4个通道,然后丢弃其中的3个通道。如果您的数据是由通道分隔的,即所有R通道值的数组,然后是所有G值的数组,依此类推,那么一次处理1个通道会更好,而您只需要对数据进行1次传递。

毕竟,请查看数据的组织方式并执行测试和测量。

答案 1 :(得分:0)

我想我找到了部分答案。

在计算时间方面 1次漂浮a *浮动a 和1次vec4(a,a,a,a)* vec4(a,a,a,a),

所以我们需要尽可能多地使用vec4操作。

根据GPU Gems 2中的“Chapter 35. GPU Program Optimization”,它们应该是相同的。