SIMT 和 SIMD 中的控制流发散
Posted
技术标签:
【中文标题】SIMT 和 SIMD 中的控制流发散【英文标题】:Control flow divergence in SIMT and SIMD 【发布时间】:2012-12-31 07:08:15 【问题描述】:我正在阅读this 的书以深入研究 CUDA 的概念。在其中一章中,它介绍了 SIMT 的概念
SIMT 中的控制流发散选项还简化了程序员使用额外指令来处理的要求 与 SSE 相比的控制流。
我知道这个声明是基于这样一个事实,即 SSE 工作在 SIMD 实现技术上,而 CUDA 线程工作在 SIMT 原理上,但是任何人都可以使用一些例子来详细解释/解释这句话。 提前致谢。
【问题讨论】:
【参考方案1】:使用 SIMD,如果您有一个例程需要以不同于其他元素的方式处理某些元素,那么您需要明确处理屏蔽操作,以便它们仅应用于正确的元素。使用 CUDA 的 SIMT 架构,您可以在每个线程上获得控制流的错觉,因此您不需要显式屏蔽操作 - 当然,这仍然发生在“幕后”,但负担已从程序员。
示例:假设您要将所有负元素设置为零。在 CUDA 中:
if (X[tid] < 0)
X[tid] = 0; // NB: CUDA core steps through this instruction but only executes
// it if the preceding condition was true
在 SIMD (SSE) 中:
__m128 mask = _mm_cmpge_ps(X, _mm_set1_ps(0)); // generate mask for all elements >= 0
X = _mm_and_ps(X, mask); // clear all elements which are < 0
【讨论】:
您可能希望将 CUDA 代码与 OpenMP 4#pragma omp simd
进行比较,在这种情况下,编译器将在幕后生成掩码。以上是关于SIMT 和 SIMD 中的控制流发散的主要内容,如果未能解决你的问题,请参考以下文章