如果某些线程比其他线程先结束会发生啥?

Posted

技术标签:

【中文标题】如果某些线程比其他线程先结束会发生啥?【英文标题】:What happens if some threads ends first than others?如果某些线程比其他线程先结束会发生什么? 【发布时间】:2013-10-21 17:40:30 【问题描述】:

我正在努力将搜索模式与 CUDA 中的自动机并行化。

所以,每个线程都会取一个不同的“单词”来查看它是否被自动机接受。

我想知道当某些线程比其他线程先结束时考虑经纱发散是否有任何问题。

假设线程 1 使用单词 1,线程 2 使用单词 2(依此类推,直到 32)...

如果偶数的线程(只是一个假设)先完成工作,奇数的线程继续运行,它对扭曲发散或任何其他效率问题有很大影响吗?还是不影响效率?

【问题讨论】:

【参考方案1】:

是的,warp 发散会影响效率。

然而,warp 发散并不是你必须不惜一切代价避免的某种问题。许多许多 CUDA 代码都经历了某种程度的扭曲发散。

特定算法导致翘曲发散的事实不一定是不尝试它的理由。

如果您正在优化算法并且发现翘曲发散是一个普遍存在的问题(例如,使用视觉分析器),那么您可能会尝试想办法减少它。但是你的代码的最终衡量标准是它的整体性能,而不是它的扭曲发散程度。只有减少翘曲发散才能提高性能。

如果您想到了另一种不会导致分歧的替代算法,并且正在对所有线程和机器周期进行有用的工作,那么它可能会更快。但是,除非您已经考虑到该算法,否则这一点是没有意义的。大概你必须实现一些东西,对吧?

没有人可以从您的描述中看出扭曲发散会对您的代码产生多大的影响。这取决于 偶数线程提前多远完成工作(因此处于空闲状态)。即便如此,这也只有在你知道一种更好的方法来制作它而不产生分歧时才重要。

差异只是您的代码可能需要改进的地方的一个指标。

如果您知道数据中可以预测线程执行时间的模式,那么您可能会尝试重新组织数据以将具有相似处理时间的元素组合在一起。这将倾向于最大限度地减少分歧对效率的影响。我认为一些 GPU 排序代码可以做到这一点。在您的情况下,如果您可以重新排列数据以将偶数元素组合在一起(如果它们导致“更短”的线程),您可以利用类似的技术来减少分歧对效率的影响。当然,在存在扭曲发散的情况下,重组数据的时间成本可能会超过提高效率所带来的时间收益。

【讨论】:

一个完整的问题,回答我提出的所有问题并给出一个建议。谢谢!

以上是关于如果某些线程比其他线程先结束会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

多线程,如果线程崩溃,应用程序会发生啥

主线程啥都没做,就会等待子线程结束。这是为啥?

在 Qt 中,当线程结束时对象会发生啥?

并发编程——协程

java面试啥是多线程

如果在其他线程仍在运行时调用exit会发生什么?