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 中的控制流发散的主要内容,如果未能解决你的问题,请参考以下文章

ssis中控制流和数据流的区别

Control Flow in Tensorflow TF中的控制流解析

有没有 '?' Python中的控制流? [复制]

有没有 '?' Python中的控制流? [复制]

20145235 《信息安全系统设计基础》第十一周学习总结

CSAPP:第八章 异常控制流1