AVX重载运算类

计算AVX指令向量同数据类型间的加、减、乘、除以及自加、自减、自乘和自除的重载运算。

接口定义

加法运算:

__m128i operator + (const __m128i &a, const __m128i &b);

__m256i operator + (const __m256i &a, const __m256i &b);

__m256 operator + (const __m256 &a, const __m256 &b);

__m256d operator + (const __m256d &a, const __m256d &b);

__m512i operator + (const __m512i &a, const __m512i &b);

__m512 operator + (const __m512 &a, const __m512 &b);

__m512d operator + (const __m512d &a, const __m512d &b);

减法运算:

__m128i operator - (const __m128i &a, const __m128i &b);

__m256i operator - (const __m256i &a, const __m256i &b);

__m256 operator - (const __m256 &a, const __m256 &b);

__m256d operator - (const __m256d &a, const __m256d &b);

__m512i operator - (const __m512i &a, const __m512i &b);

__m512 operator - (const __m512 &a, const __m512 &b);

__m512d operator - (const __m512d &a, const __m512d &b);

乘法运算:

__m128i operator * (const __m128i &a, const __m128i &b);

__m256i operator * (const __m256i &a, const __m256i &b);

__m256 operator * (const __m256 &a, const __m256 &b);

__m256d operator * (const __m256d &a, const __m256d &b);

__m512i operator * (const __m512i &a, const __m512i &b);

__m512 operator * (const __m512 &a, const __m512 &b);

__m512d operator * (const __m512d &a, const __m512d &b);

除法运算:

__m128i operator / (const __m128i &a, const __m128i &b);

__m256i operator / (const __m256i &a, const __m256i &b);

__m256 operator / (const __m256 &a, const __m256 &b);

__m256d operator / (const __m256d &a, const __m256d &b);

__m512i operator / (const __m512i &a, const __m512i &b);

__m512 operator / (const __m512 &a, const __m512 &b);

__m512d operator / (const __m512d &a, const __m512d &b);

与运算:

__m128i operator & (const __m128i &a, const __m128i &b);

__m256i operator & (const __m256i &a, const __m256i &b);

__m256 operator & (const __m256 &a, const __m256 &b);

__m256d operator & (const __m256d &a, const __m256d &b);

__m512i operator & (const __m512i &a, const __m512i &b);

__m512 operator & (const __m512 &a, const __m512 &b);

__m512d operator & (const __m512d &a, const __m512d &b);

或运算:

__m128i operator | (const __m128i &a, const __m128i &b);

__m256i operator | (const __m256i &a, const __m256i &b);

__m256 operator | (const __m256 &a, const __m256 &b);

__m256d operator | (const __m256d &a, const __m256d &b);

__m512i operator | (const __m512i &a, const __m512i &b);

__m512 operator | (const __m512 &a, const __m512 &b);

__m512d operator | (const __m512d &a, const __m512d &b);

异或运算:

__m128i operator ^ (const __m128i &a, const __m128i &b);

__m256i operator ^ (const __m256i &a, const __m256i &b);

__m256 operator ^ (const __m256 &a, const __m256 &b);

__m256d operator ^ (const __m256d &a, const __m256d &b);

__m512i operator ^ (const __m512i &a, const __m512i &b);

__m512 operator ^ (const __m512 &a, const __m512 &b);

__m512d operator ^ (const __m512d &a, const __m512d &b);

自加运算:

__m128i &operator += (__m128i &a, const __m128i &b);

__m256i &operator += (__m256i &a, const __m256i &b);

__m256 &operator += (__m256 &a, const __m256 &b);

__m256d &operator += (__m256d &a, const __m256d &b);

__m512i &operator += (__m512i &a, const __m512i &b);

__m512 &operator += (__m512 &a, const __m512 &b);

__m512d &operator += (__m512d &a, const __m512d &b);

自减运算:

__m128i &operator -= (__m128i &a, const __m128i &b);

__m256i &operator -= (__m256i &a, const __m256i &b);

__m256 &operator -= (__m256 &a, const __m256 &b);

__m256d &operator -= (__m256d &a, const __m256d &b);

__m512i &operator -= (__m512i &a, const __m512i &b);

__m512 &operator -= (__m512 &a, const __m512 &b);

__m512d &operator -= (__m512d &a, const __m512d &b);

自乘运算:

__m128i &operator *= (__m128i &a, const __m128i &b);

__m256i &operator *= (__m256i &a, const __m256i &b);

__m256 &operator *= (__m256 &a, const __m256 &b);

__m256d &operator *= (__m256d &a, const __m256d &b);

__m512i &operator *= (__m512i &a, const __m512i &b);

__m512 &operator *= (__m512 &a, const __m512 &b);

__m512d &operator *= (__m512d &a, const __m512d &b);

自除运算:

__m128i &operator /= (__m128i &a, const __m128i &b);

__m256i &operator /= (__m256i &a, const __m256i &b);

__m256 &operator /= (__m256 &a, const __m256 &b);

__m256d &operator /= (__m256d &a, const __m256d &b);

__m512i &operator /= (__m512i &a, const __m512i &b);

__m512 &operator /= (__m512 &a, const __m512 &b);

__m512d &operator /= (__m512d &a, const __m512d &b);

自与运算:

__m128i &operator &= (__m128i &a, const __m128i &b);

__m256i &operator &= (__m256i &a, const __m256i &b);

__m256 &operator &= (__m256 &a, const __m256 &b);

__m256d &operator &= (__m256d &a, const __m256d &b);

__m512i &operator &= (__m512i &a, const __m512i &b);

__m512 &operator &= (__m512 &a, const __m512 &b);

__m512d &operator &= (__m512d &a, const __m512d &b);

自或运算:

__m128i &operator |= (__m128i &a, const __m128i &b);

__m256i &operator |= (__m256i &a, const __m256i &b);

__m256 &operator |= (__m256 &a, const __m256 &b);

__m256d &operator |= (__m256d &a, const __m256d &b);

__m512i &operator |= (__m512i &a, const __m512i &b);

__m512 &operator |= (__m512 &a, const __m512 &b);

__m512d &operator |= (__m512d &a, const __m512d &b);

自异或运算:

__m128i &operator ^= (__m128i &a, const __m128i &b);

__m256i &operator ^= (__m256i &a, const __m256i &b);

__m256 &operator ^= (__m256 &a, const __m256 &b);

__m256d &operator ^= (__m256d &a, const __m256d &b);

__m512i &operator ^= (__m512i &a, const __m512i &b);

__m512 &operator ^= (__m512 &a, const __m512 &b);

__m512d &operator ^= (__m512d &a, const __m512d &b);

参数

参数名

描述

取值范围

输入/输出

a

指令向量数据类型的引用。

不限

输入/输出

b

指令向量数据类型的引用。

不限

输入

输出结果

与入参同类型的指令向量数据。

  • 重载运算类函数使用需单独包含头文件“operatoroverload.h”
  • 重载运算类函数的使用语言为C++,指令类函数的使用函数语言为C/C++。

示例

  1. 创建testavx.cpp文件,文件内容如下。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdint.h>
    #include "avx2ki.h"
    #include "operatoroverload.h"
    
    void OperatorExample()
    {
        int64_t a[2] = {-5, 13};
        int64_t b[2] = {12, 3};
        int64_t c[2] = {0};
        __m128i t1 = _mm_load_epi64(a);
        __m128i t2 = _mm_load_epi64(b);
        __m128i dst = t1 + t2;
        _mm_store_epi64(c, dst);
        printf("dst: %ld %ld\n", c[0], c[1]);
    }
    
    int main(void) {
        OperatorExample();
        return 0;
    }
    

  2. 编译。

    g++ testavx.cpp -o testavx -I/usr/local/ksl/include -L/usr/local/ksl/lib -lavx2ki
    运行结果:
    1
    dst: 7 16