我正在处理网格中的项目,具体取决于项目的类型,需要执行不同类型的计算/功能。但我读过分支在做同样事情的工作项之间做的很糟糕。为了避免这种情况,我可以将网格分成每种类型的网格(在这种特殊情况下我只需要两个)...
在这种情况下会更好;将分支留在那里,或者为每种类型制作两个网格?我理解这取决于分支内部发生的事情(计算界限)与网格的大小(内存/延迟限制)。
对于这些类型的决策是否有一些基本规则可以遵循,或者是否达成共识哪个更好?
修改: (空间)网格不像通常的空间网格那样稀疏,而是结构的密集数组(没有空元素)(每个结构约200个字节),最多可容纳500.000个元素。
我从另一个来源填充这个数组,使用该源我在其中放置三角形或linesegments。
然后使用这个网格,我需要进行linesegment / linesegment或linesegment / triangle碰撞检测。所以问题是在这种情况下填充两个单独的数组(为了参数可以说250.000个元素x 200个字节)是否更有效,并且工作项仅对行/行或行/三角形进行批量计算..或者有500.000x200字节中的一个大字节,让每个工作项找出给定类型执行的计算。
答案 0 :(得分:1)
对此没有一般规则,取决于具体情况。如果你编写很多代码显然重新安排内存更好。但是,如果你的分支只是2个指令,那么不要重塑内存。
我首先要对每种类型(CPU方面或简单内核)中的项目进行分类,并为每种类型的项目运行特定内核。但是,这可能不适合您的情况。
如果您可以发布一些代码,也许我们可以指出您正确的方向。
答案 1 :(得分:1)
这取决于新网格的结构,也取决于您的旧网格。
让我们采取最坏的情况。普通的矩形网格(如图像)如果每个奇数项都是类型1并且每个偶数都是类型2.现在基本上一半的线程将在GPU中闲置(而type1被计算为type2线程' idle& #39)。这是因为工作组中的项目通常共享其程序计数器。
如果你的新网格是2个内核调用而且简单"不是type2?返回"然后它比第一种情况更糟糕。但是,如果您设法制作2个网格,其中每个项目的类型都是正确的,那么拆分它会好得多。
如果您的原始网格是精确的两半图像,那么它可能并不重要。只有边界内的群体才会执行额外的工作。
分支机构不是那么邪恶。只要想一想,无论何时你有一个分支甚至工作组中的一个线程(或者你的硬件中的任何调度单元)都会采用与其他分支不同的方向,两个分支中的所有代码都将被带到任何地方。
这也是为什么如果某些特殊条件适用而不执行昂贵计算的优化在GPU上通常不起作用的原因,因为如果其他线程没有满足条件,您仍将有效地计算它每个帖子。