首页 > 其他分享 >【代码分享】使用 avx2 + 查表法,优化凯撒加密

【代码分享】使用 avx2 + 查表法,优化凯撒加密

时间:2023-10-21 17:13:24浏览次数:45  
标签:avx2 查表 avx512 代码 版本 include 凯撒

作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!


接上一篇:【代码分享】使用 avx512 + 查表法,优化凯撒加密

好不容易捣鼓出来了 avx512 指令集的查表法代码,可是部署的时候发现服务器不支持 avx512 指令集。
终于,avx2 版本的查表法终于写出来了。上代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include <immintrin.h>
#include <avx2intrin.h>
#include <inttypes.h>
#include <assert.h>

typedef uint32_t Table[26][256];

void initTable(Table *table){
    for (int i=0; i<26; i++){
        for (int j=0; j<256; j++){
            if (j>='a' && j<='z'){
                (*table)[i][j] = (uint8_t)((j-'a'+i)%26 + 'a');
            } else if (j>='A' && j<='Z'){
                (*table)[i][j] = (uint8_t)((j-'A'+i)%26 + 'A');
            } else {
                (*table)[i][j] = j;
            }
        }
    }
}

void caesarEncodeAVX2(void* out1, void* in1, uint64_t len, uint64_t rot, void* table1){
	uint8_t* out = (uint8_t*)out1;
	uint8_t* in = (uint8_t*)in1;
	Table* table = (Table*)table1;  // 这些代码为了解决  cgo 中函数调用的警告
	//
	rot = rot % 26;
    uint32_t* line = (uint32_t*)((*table)[rot]);
    #define batchSize  16
    uint64_t tailLen = len & 0x0f;
    uint8_t* end = in + len - tailLen;
    uint8_t* start = in;
    const __m256i index_mask = _mm256_set_epi32(
        7, 6, 3, 2,
        5,4, 1, 0
    );
    for (; start<end;  out += batchSize, start += batchSize){
        __m128i src = _mm_loadu_si128(start);  // 加载 16 个字符,但只处理前面 8 个字符
        __m256i srcI32 = _mm256_cvtepu8_epi32(src);  // 前  8  个字节,转换为 32 字节
        __m256i foundHead = _mm256_i32gather_epi32(line, srcI32, 4);  // 8  字节查表
        // 处理后面 8 字节
        src = _mm_srli_si128(src, 8);  // 移动 8 字节,也就是 64 位
        srcI32 = _mm256_cvtepu8_epi32(src);  //  后  8  个字节,转换为 32 字节
        __m256i foundTail = _mm256_i32gather_epi32(line, srcI32, 4);  // 8  字节查表        
        // 进行压缩
        __m256i found16 = _mm256_packus_epi32(foundHead, foundTail);  // 16 个  16 位的值
        /*
              _mm256_packus_epi32 这个指令非常的恶心:aaaa bbbb 合并成了  aa bb aa bb
              于是还要用下面这个指令把顺序换过来
        */
        found16 =  _mm256_permutevar8x32_epi32 (found16, index_mask);  // 换过来了,正常了
        found16 =  _mm256_packus_epi16(found16, _mm256_setzero_si256());
        found16 =  _mm256_permutevar8x32_epi32 (found16, index_mask);  // 换过来了,正常了
        //存储
        __m128i result = _mm256_castsi256_si128(found16);
        _mm_storeu_si128 (out, result);
    }
    //
    end = in + len;
    for (; start<end; start++, out++){
        *out = (uint8_t)line[*start];
    }
}

// 逐字节处理的版本
void caesarEncode(uint8_t* out, uint8_t* in, int len, int rot, Table* t){
    rot = rot % 26;
    uint8_t* end = in + len; 
    uint32_t* line = (uint32_t*)((*t)[rot]);
    for (;in<end; in++, out++){
        *out = (uint8_t)line[*in];
    }
}

编译:

gcc -o caesar caesar.c -g -w -mavx -mavx2 -O3

测试了一下各个版本的性能表现:

逐字节处理版本:total:201429 us, avg: 100.715 ns/op
AVX2 版本:       total:51059 us, avg: 25.529 ns/op
AVX512  版本:   total:49756 us, avg: 24.878 ns/op

avx512 版本只比 avx2 快了一点点,鸡肋!

标签:avx2,查表,avx512,代码,版本,include,凯撒
From: https://www.cnblogs.com/ahfuzhang/p/17779227.html

相关文章

  • 不管表里的内容 仅查表的结构: desc 表名;
    对比包含表中数据 ......
  • 适用于小空间mcu的移位查表(ntc查表输出温度)
    需要数组从小到大排列,电路是ntc上拉所以数组和ad值都用4095相减。点击查看代码voidTemp(){u8temp,count;u16temp_ad_v;temp_ad_v=4095-Board_GetAD_12bit(ADC_CH4); temp=0x00; count=0x40;//0x20,MAX:63;0x40,MAX:127;0x80,MAX:191......
  • 算法复杂度速查表
    https://zhuanlan.zhihu.com/p/158694568目录目录1.背景2.Big-OComplexityChart3.CommonDataStructureOperations4.ArraySortingAlgorithms1.背景最近看到一篇总结算法复杂度的博客,原作者Eric是为了面试方便而总结出了一份算法复杂度速查表,在此转载一下......
  • 神经网络速查表
    转自网络。......
  • 【Sword系列】第七届全国残疾人职业技能大赛样题-网络安全-变异凯撒
    前言在密码学中,凯撒密码是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。ROT13是凯撒密码的一种变体,即移位数为13。RO......
  • git常用命令行速查表
    上传git,基本四步曲(默认master分支)1.gitpull---把远程文件同步到本地,避免发生冲突2.gitadd.---暂存所有新增文件)3.gitcommit-m"提交日志"---提交所有暂存(提交所有变动:gitcommit-m“提交日志”-a)4.gitpush---推送(非master分支:gitpushorigin分支名)1.在......
  • dB与倍数换算速查表
    dB与倍数换算速查表计算公式:dB=10log(P1/P2)P1/P2:是功率的倍数。示例:P1为2W,P2为1W10log(2W/1W)=10log(2)=3dB即3dB代表2倍倍数1<--------->0dB倍数10<--------->10dB倍数100<--------->20dB倍数1000<--------->30dB  ......
  • iOS app图标尺寸规范速查表:设计师收藏必备!
    在UI设计中,图标作为重要的视觉元素扮演着不可或缺的角色。尽管图标所占空间相对较小,却是衡量设计师基本功的重要标准。了解图标设计和遵守iOSapp图标规范是每个设计师入门UI设计的必备条件。本文将深入探索iOSapp图标规范,为设计师们提供有价值的指导和灵感。  ios应用程......
  • 密码学:凯撒密码(移位密码)原理、加密与解密(Python代码示例)
    原理凯撒密码(移位密码):是一种替换加密,明文中的所有字母都在字母表上向后或向前按照一个固定数目进行偏移后被替换成密文。例如,偏移量为3位的时候:A对应D,B对应E,C对应F等当偏移量为13位的时候,凯撒密码又叫回转密码(ROT13):明文加密得到密文,密文再加密就会得到明文(因为偏移量为13位,一共......
  • git命令速查表-Git命令大全(思维导图)-图片版
    - -     ---来源:https://blog.csdn.net/m0_47403102/article/details/122538395......