avx2相关内容
我有一个由 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
..
查看 AVX2 内部函数文档,那里收集了一些加载指令,例如 VPGATHERDD: __m128i _mm_i32gather_epi32 (int const * base, __m128i index, const int scale); 我从文档中不清楚计算出的加载地址是元素地址还是字节地址,即元素i: load_addr = base + index[i] * scale;//(1)
..
考虑一个随机生成的 __m256i 向量.有没有比除以 0(包含)和 1(不包含)之间的浮点数转换为 __m256 向量的更准确的方法>float(1ull? 这是我到目前为止所尝试的,其中 iRand 是输入,ans 是输出: const __m256 fRand = _mm256_cvtepi32_ps(iRand);const __m256 归一化 = _mm256_div_ps(f
..
我目前正在对 DSP 应用程序进行一些优化和比较矢量化可能性,这对于 AVX512 来说似乎是理想的,因为这些只是简单的不相关数组处理循环.但是在新的 i9 上,与 AVX2 相比,我在使用 AVX512 时没有测量出任何合理的改进.任何指针?有什么好的结果吗?(顺便说一句.我试过 MSVC/CLANG/ICL,没有明显区别,很多时候 AVX512 代码实际上看起来更慢) 解决方案 这看起
..
想象一下这段代码: void Function(int16 *src, int *indices, float *dst, int cnt, float mul){for (int i=0; i
..
这个问题是这个.在这里,我提出了两种可能的解决方案,我想知道它们的可行性.我正在使用带有 GCC/ICC 编译器的 Haswell 微体系结构.我还假设内存是对齐的. 选项 1 - 我已经分配了一个内存位置并进行了 3 次内存移动.(我使用 memmove 而不是 memcpy 来避免复制构造函数). void swap_memory(void *A, void* B, size_t TO
..
我正在尝试编写非常有效的汉明距离代码.受到 WojciechMuła的极其聪明的SSE3 popcount 实现的启发,我编写了一个等效于AVX2的解决方案,这次使用256位寄存器.基于相关操作的两倍并行度,我预计将至少提高30%-40%,但是令我惊讶的是,AVX2代码要慢一点(约2%)! 有人可以启发我为什么我无法获得预期的性能提升吗? 两个64字节块的展开SSE3海明距离: I
..
我想将8个整数从 __ m256i 变量存储到8 x 32位 int s的数组中.我以为该指令是 _mm256_store_epi32 ,但是我收到一条错误消息,指出该指令甚至不存在! 解决方案 看看
..
您可以找到很多好 https://software.intel.com/zh-CN/articles/3d-vector-normalization-using-256-bit-intel-advanced-vector-extensions-intel-avx
..
我正在尝试在AVX2中向左旋转128位数字.由于没有这样做的直接方法,因此我尝试使用左移和右移来完成任务. 这是我的代码的摘要. l = 4;r = 4;targetrotate = _mm_set_epi64x(l,r);targetleftrotate = _mm_sllv_epi64(target,targetrotate); 上面的code代码片段将目标向左旋转4. 当我使
..
我正在尝试将__m256i变量与数组中的32个字符组成并由索引指定.这是我的代码: char数组[];//每次都使用不同的数组.uint16_t偏移量[32];//多次重复使用相同的偏移量_mm256_set_epi8(array [offset [0]],array [offset [1]],array [offset [2]],array [offset [3]],array [offse
..
基本上,在结果矢量中,我想为所有输入浮点值> 1保留1.0,而为所有输入浮点值
..
我有一个需要AVX2正常运行的应用程序.已实施检查以在应用程序启动期间检查CPU是否具有AVX2指令.我想检查它是否正常工作,但是我只有具有AVX2的CPU.有没有一种方法可以暂时将其关闭以进行测试?还是以某种方式模仿其他CPU? 解决方案 是的,请使用
..
我有两个__m256i向量,用32个8位整数填充.像这样: __int8 * a0 =新的__int8 [32] {2};__int8 * a1 =新的__int8 [32] {3};__m256i v0 = _mm256_loadu_si256((__ m256i *)a0);__m256i v1 = _mm256_loadu_si256((__ m256i *)a1); 如何使用类似
..
我正在尝试通过使用_mm256_shuffle_epi8将16位数据打包为8位,但是我得到的结果不是我期望的. 自动srcData = _mm256_setr_epi8(1、2、3、4、5、6、7、8、9、10、11、12、13、14、15、16,17、18、19、20、21、22、23、24、25、26、27、28、29、30、31、32);__m256i vperm = _mm256_set
..
我已经遍历了 Intel Intrinsics ,并且每个函数都对整数或打包或未打包或扩展打包的float或double. 似乎应该在互联网上的某个地方回答这个问题,但我根本找不到答案. 那是什么包装物? 解决方案 好吧,我一直在寻找相同问题的答案,但是也没有成功.所以我只能猜测. 英特尔已经在其MMX技术中引入了打包和标量指令.例如,他们引入了一个功能 __ m64
..
我有两个 __ m256i 向量(每个向量都包含字符),我想找出它们是否完全相同.如果所有位都相等,我需要的是 true ,否则是 0 . 最有效的方法是什么?这是加载数组的代码: char * a1 ="abcdefhgabcdefhgabcdefhgabcdefhg";__m256i r1 = _mm256_load_si256((__ m256i *)a1);char * a2 =
..
我目前在具有GPU的许多服务器上运行BOINC. 服务器同时运行GPU和CPU BOINC应用程序. 由于AVX和SSE在CPU应用程序中使用时会降低CPU频率,因此我必须选择同时运行哪个CPU/GPU,因为某些GPU应用程序会像其他应用程序那样瓶颈(运行时间完成较慢)不是. 目前,某些CPU应用已被命名,因此可以清楚地看到它们是否使用了AVX,但大多数都没有. 因此,有什
..
我正在寻找有效的方法来计算以下函数: 输入: __ m128i数据,uint8_t输入; 输出:布尔值,指示 data 中的任何字节是否在 in 中. 我实际上是在使用它们为容量为8的字节实现时空有效的堆栈.我最有效的解决方案是首先计算一个 __ m128i tmp ,所有字节均作为 in .然后检查 tmp \ xor数据中的任何字节是否为零字节. 解决方案 是的,AV
..
我有_m256i个向量,这些向量在16位整数内包含10位字(因此16 * 16位仅包含16 * 10个有用位).最好/最快的方法是仅提取那些10位并打包以产生10位值的输出位流? 解决方案 这是我的尝试. 尚未进行基准测试,但我认为它总体上应该可以很快运行:指令太多,在现代处理器上所有指令都有1个延迟周期.存储也很有效,有2条存储指令可存储20个字节的数据. 该代码仅使用3个常
..