我正在阅读这本书来深入研究 CUDA 的概念。在其中一章中,它介绍了 SIMT 的概念,它说
与 SSE 相比,SIMT 中控制流发散的选项还简化了程序员使用额外指令来处理控制流的要求。
我知道这个声明是基于 SSE 工作于 SIMD 实现技术和 CUDA 线程工作于 SIMT 原理的事实,但任何人都可以使用一些示例详细说明/解释这句话。提前致谢。
使用 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