avx2相关内容

使用 SIMD 解交织半字节向量

我有一个由 16384 个带符号的四位整数组成的输入向量.它们被打包成 8192 字节.我需要交错这些值并将其解压缩为两个单独数组中的有符号 8 位整数. a,b,c,d 是 4 位值. A、B、C、D 是 8 位值. 输入 = [ab,cd,...] Out_1 = [A,C, ...] Out_2 = [B,D, ...] 我可以很容易地用 C++ 做到这一点. co ..
发布时间:2021-08-27 19:46:25 C/C++开发

使用AVX2收集指令时的加载地址计算

查看 AVX2 内部函数文档,那里收集了一些加载指令,例如 VPGATHERDD: __m128i _mm_i32gather_epi32 (int const * base, __m128i index, const int scale); 我从文档中不清楚计算出的加载地址是元素地址还是字节地址,即元素i: load_addr = base + index[i] * scale;//(1) ..
发布时间:2021-08-27 19:44:20 其他开发

简单阵列处理循环的 AVX 512 与 AVX2 性能对比

我目前正在对 DSP 应用程序进行一些优化和比较矢量化可能性,这对于 AVX512 来说似乎是理想的,因为这些只是简单的不相关数组处理循环.但是在新的 i9 上,与 AVX2 相比,我在使用 AVX512 时没有测量出任何合理的改进.任何指针?有什么好的结果吗?(顺便说一句.我试过 MSVC/CLANG/ICL,没有明显区别,很多时候 AVX512 代码实际上看起来更慢) 解决方案 这看起 ..
发布时间:2021-06-15 19:11:51 其他开发

C - 交换两个相同大小的内存块的最快方法?(解决方案可行性)

这个问题是这个.在这里,我提出了两种可能的解决方案,我想知道它们的可行性.我正在使用带有 GCC/ICC 编译器的 Haswell 微体系结构.我还假设内存是对齐的. 选项 1 - 我已经分配了一个内存位置并进行了 3 次内存移动.(我使用 memmove 而不是 memcpy 来避免复制构造函数). void swap_memory(void *A, void* B, size_t TO ..
发布时间:2021-06-02 19:34:21 其他开发

AVX 256位代码的性能略逊于等效的128位SSSE3代码

我正在尝试编写非常有效的汉明距离代码.受到 WojciechMuła的极其聪明的SSE3 popcount 实现的启发,我编写了一个等效于AVX2的解决方案,这次使用256位寄存器.基于相关操作的两倍并行度,我预计将至少提高30%-40%,但是令我惊讶的是,AVX2代码要慢一点(约2%)! 有人可以启发我为什么我无法获得预期的性能提升吗? 两个64字节块的展开SSE3海明距离: I ..
发布时间:2021-04-19 20:54:45 C/C++开发

avx2指令存储8个整数是什么?

我想将8个整数从 __ m256i 变量存储到8 x 32位 int s的数组中.我以为该指令是 _mm256_store_epi32 ,但是我收到一条错误消息,指出该指令甚至不存在! 解决方案 看看 ..
发布时间:2021-04-19 20:31:15 C/C++开发

使用AVX2指令向左移128位数字

我正在尝试在AVX2中向左旋转128位数字.由于没有这样做的直接方法,因此我尝试使用左移和右移来完成任务. 这是我的代码的摘要. l = 4;r = 4;targetrotate = _mm_set_epi64x(l,r);targetleftrotate = _mm_sllv_epi64(target,targetrotate); 上面的code代码片段将目标向左旋转4. 当我使 ..
发布时间:2021-04-12 20:54:45 C/C++开发

将带有uint16索引的AVX2字节收集到__m256i中

我正在尝试将__m256i变量与数组中的32个字符组成并由索引指定.这是我的代码: char数组[];//每次都使用不同的数组.uint16_t偏移量[32];//多次重复使用相同的偏移量_mm256_set_epi8(array [offset [0]],array [offset [1]],array [offset [2]],array [offset [3]],array [offse ..
发布时间:2021-04-12 20:54:30 其他开发

出于测试目的禁用CPU中的AVX2

我有一个需要AVX2正常运行的应用程序.已实施检查以在应用程序启动期间检查CPU是否具有AVX2指令.我想检查它是否正常工作,但是我只有具有AVX2的CPU.有没有一种方法可以暂时将其关闭以进行测试?还是以某种方式模仿其他CPU? 解决方案 是的,请使用 ..
发布时间:2021-04-12 20:54:11 其他开发

打包和解包以及扩展打包数据是什么

我已经遍历了 Intel Intrinsics ,并且每个函数都对整数或打包或未打包或扩展打包的float或double. 似乎应该在互联网上的某个地方回答这个问题,但我根本找不到答案. 那是什么包装物? 解决方案 好吧,我一直在寻找相同问题的答案,但是也没有成功.所以我只能猜测. 英特尔已经在其MMX技术中引入了打包和标量指令.例如,他们引入了一个功能 __ m64 ..
发布时间:2021-04-12 20:53:59 其他开发

比较AVX/AVX2中的两个向量(c)

我有两个 __ m256i 向量(每个向量都包含字符),我想找出它们是否完全相同.如果所有位都相等,我需要的是 true ,否则是 0 . 最有效的方法是什么?这是加载数组的代码: char * a1 ="abcdefhgabcdefhgabcdefhgabcdefhg";__m256i r1 = _mm256_load_si256((__ m256i *)a1);char * a2 = ..
发布时间:2021-04-12 20:53:56 其他开发

Ubuntu-如何判断CPU应用程序当前是否正在使用AVX或SSE?

我目前在具有GPU的许多服务器上运行BOINC. 服务器同时运行GPU和CPU BOINC应用程序. 由于AVX和SSE在CPU应用程序中使用时会降低CPU频率,因此我必须选择同时运行哪个CPU/GPU,因为某些GPU应用程序会像其他应用程序那样瓶颈(运行时间完成较慢)不是. 目前,某些CPU应用已被命名,因此可以清楚地看到它们是否使用了AVX,但大多数都没有. 因此,有什 ..
发布时间:2021-04-12 20:53:50 其他开发

使用SSE/AVX/AVX2检查__m128i的所有字节是否匹配单个字节

我正在寻找有效的方法来计算以下函数: 输入: __ m128i数据,uint8_t输入; 输出:布尔值,指示 data 中的任何字节是否在 in 中. 我实际上是在使用它们为容量为8的字节实现时空有效的堆栈.我最有效的解决方案是首先计算一个 __ m128i tmp ,所有字节均作为 in .然后检查 tmp \ xor数据中的任何字节是否为零字节. 解决方案 是的,AV ..
发布时间:2021-04-12 20:53:38 其他开发

在16位字中仅保留10个有用位

我有_m256i个向量,这些向量在16位整数内包含10位字(因此16 * 16位仅包含16 * 10个有用位).最好/最快的方法是仅提取那些10位并打包以产生10位值的输出位流? 解决方案 这是我的尝试. 尚未进行基准测试,但我认为它总体上应该可以很快运行:指令太多,在现代处理器上所有指令都有1个延迟周期.存储也很有效,有2条存储指令可存储20个字节的数据. 该代码仅使用3个常 ..
发布时间:2021-04-12 20:53:16 其他开发