我正在努力将搜索模式与CUDA中的自动机并行化。
因此,每个帖子都会使用不同的“单词”来查看它是否被自动机接受。
我想知道当一些线程首先比其他线程结束时考虑扭曲发散时是否有任何问题。
假设线程1取字1,线程2取字2(依此类推,直到32)......
如果具有偶数的线程(只是一个假设)首先完成工作,并且奇数线程继续运行,它是否会对经线发散或任何其他效率问题产生重大影响?或者它对效率没有影响?
答案 0 :(得分:2)
是的,扭曲分歧会影响效率。
但是,经线偏差不是一个必须不惜一切代价避免的问题。许多CUDA代码经历了某种程度的扭曲分歧。
特定算法导致扭曲发散的事实不一定是不尝试它的理由。
如果您正在优化算法并发现扭曲分歧是一个普遍存在的问题(例如,使用可视化分析器),那么您可能会尝试考虑减少它的方法。但是代码的最终衡量标准是它的整体性能,而不是它的经线偏差水平。减少扭曲分歧只有在它可以改善性能的情况下才有价值。
如果您考虑到另一种不会导致分歧的替代算法,并且正在对所有线程和机器周期进行有用的工作,那么它可能会更快。但除非你已经考虑过这个算法,否则重点是没有意义。大概你必须实现一些东西,对吗?
没有人能从您的描述中看出经线偏差会对您的代码产生多大影响。它取决于像甚至线程完成工作的距离(因此是空闲的)。即便如此,只有当你知道一种更好的方法来制作它而没有分歧时,这才有意义。
分歧只是代码中可能需要改进的一个指标。
如果您知道数据中预测线程执行时间的模式,那么您可以尝试重新组织数据,以便将具有相似处理时间的元素组合在一起。这将倾向于最小化分歧的效率影响。我认为,有些GPU排序代码会这样做。在您的情况下,如果您可以重新排列数据以将偶数元素组合在一起(如果它们导致“更短”的线程),您可以利用类似的技术来降低分歧的效率影响。当然,重组数据的时间成本可能会超过在出现扭曲分歧时提高效率的时间效益。