控制SIMT和SIMD中的流量偏差

时间:2012-12-31 07:08:15

标签: cuda sse simd

我正在阅读this书,深入研究CUDA的概念。其中一章介绍了SIMT的概念,

  

SIMT中控制流分歧的选项还简化了程序员使用额外指令来处理的要求   控制流量与SSE相比。

我知道这个陈述是基于SSE在SIMD实现技术上工作而CUDA线程在SIMT原理上工作的事实,但是任何人都可以使用一些例子详细说明/解释这句话。 提前谢谢。

1 个答案:

答案 0 :(得分:10)

如果您有一个例程,其中某些元素需要以不同于其他元素的方式处理,那么您需要明确地处理屏蔽操作,以便它们仅应用于正确的元素。使用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