Post

SIMD parallel

SIMD parallel

1 基本概念

SIMD(Single Instruction Multiple Data, 单指令流多数据流): 一种采用一个控制器来控制多个处理器,同时对一组数据(又称“数据向量”)中的每一个分别执行相同的操作从而实现空间上的并行性的技术。简单来说就是一个指令能够同时处理多个数据。

2 使用方法

2.1 IPP

使用Intel开发的跨平台函数库(IPP,Intel Integrated Performance Primitives ),里面的函数实现都使用了SIMD指令进行优化。

2.2 Auto-vectorization(自动矢量化)

借助编译器将标量操作转化为矢量操作

2.3 编译器指示符(compiler directive)

如Cilk里的#pragma simd和OpenMP里的#pragma omp simd。如下所示,使用#pragma simd强制循环矢量化:

1
2
3
4
5
6
7
8
9
void add_floatsfloat * afloat * bfloat * cfloat * dfloat * eint n
{
    int i;
#pragma simd
    fori = 0; i <n; i ++
    {
        a [i] = a [i] + b [i] + c [i] + d [i] + e [i];
    }
}

2.4 内置函数(intrinsics)

如下所示,使用SSE _mm_add_ps 内置函数,一次执行8个单精度浮点数的加法:

1
2
3
4
5
6
7
int  main()
{
	__m128 v0 = _mm_set_ps(1.0f, 2.0f, 3.0f, 4.0f);
	__m128 v1 = _mm_set_ps(1.0f, 2.0f, 3.0f, 4.0f);

	__m128 result = _mm_add_ps(v0, v1);
}

最后一种方法则是使用汇编直接操作寄存器(较麻烦)。

This post is licensed under CC BY 4.0 by the author.