相关疑难解决方法(0)

使用AVX而不是AVX2,通过许多64位位掩码分别计算每个位的位置

(相关:如何在Sandy Bridge上的一系列int中快速将位计数到单独的bin中?是对此的早期复制,带有一些不同的答案。编者注:这里的答案可能更好。

同样,是类似问题的AVX2版本,整行位的许多bin比一个宽得多uint64_t改进列填充计数算法


我正在C中的一个项目中,我需要经历数千万个掩码(ulong类型(64位)),并target基于一个简单规则更新64个短整数(uint16)的数组(称为):

// for any given mask, do the following loop
for (i = 0; i < 64; i++) {
    if (mask & (1ull << i)) {
        target[i]++
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是我需要在数以百万计的蒙版上执行上述循环,并且我需要在不到一秒钟的时间内完成。想知道是否有任何方法可以加快它的速度,例如使用某种表示上述循环的特殊汇编指令。

目前,我在ubuntu 14.04(i7-2670QM,支持AVX,而不是AVX2)上使用gcc 4.8.4来编译和运行以下代码,大约需要2秒钟。很想让它在200ms以下运行。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include <sys/stat.h>

double getTS() {
    struct timeval tv;
    gettimeofday(&tv, NULL);
    return tv.tv_sec + tv.tv_usec / 1000000.0;
}
unsigned int target[64];

int main(int argc, char *argv[]) {
    int i, …
Run Code Online (Sandbox Code Playgroud)

c optimization x86 x86-64 simd

13
推荐指数
4
解决办法
635
查看次数

是否有针对intel avx2中的movemask指令的反向指令?

movemask指令采用__m256i并返回int32,其中每个位(取决于输入向量元素类型的前4位,8位或所有32位)是相应向量元素的最高有效位.

我想做反过来:取一个32(其中只有4,8或32个最低有效位有意义),并获得__m256i,其中每个int8,int32或int64大小的块的最高有效位设置为原始位.

基本上,我想从压缩的位掩码转到可被其他AVX2指令(例如maskstore,maskload,mask_gather)用作掩码的位掩码.

我无法快速找到这样做的指令,所以我在这里问.如果没有一条具有该功能的指令,您是否可以想到一个聪明的黑客,只需很少的指令即可实现这一点?

我目前的方法是使用256元素查找表.我想在一个没有其他事情发生的循环中使用这个操作来加速它.注意,我对长多指令序列或实现此操作的小循环不太感兴趣.

x86 icc intrinsics avx avx2

8
推荐指数
1
解决办法
1696
查看次数

如何在ZMM寄存器上实现vpmovmskb的效果?

古怪的指令 (v)pmovmskb 可追溯到 SSE,它获取 mm、xmm 或 ymm 寄存器中字节的最高有效位,并将它们移动到通用寄存器中。这对于对向量元素进行分类或对单个位执行SWAR操作非常有用。具体来说,我在之前的答案中使用了这条指令来计算位置人口计数。

不幸的是,这条指令还没有扩展到 ZMM 寄存器,并且出人意料地没有出现在 AVX-512 名册中。如何有效地模拟 ZMM 寄存器的效果?我有哪些类似/其他选择?

x86 assembly bitmask avx512

5
推荐指数
1
解决办法
165
查看次数

标签 统计

x86 ×3

assembly ×1

avx ×1

avx2 ×1

avx512 ×1

bitmask ×1

c ×1

icc ×1

intrinsics ×1

optimization ×1

simd ×1

x86-64 ×1