boolean-logic - 真值表归结为三元逻辑运算,vpternlog

标签 boolean-logic intrinsics truthtable avx512

我有许多变量(7个或更多)的真值表,并且使用了一个工具(例如逻辑星期五1)来简化逻辑公式。我可以手工完成,但这太容易出错了。然后,我将这些公式转换为可以正常工作的编译器内部函数(例如_mm_xor_epi32)。

问题:使用vpternlog可以进行三元逻辑运算。但是我不知道一种将真值表简化为(某种程度上)有效的vpternlog指令序列的方法。

我并不是要问是否有人知道可以简化为任意三元逻辑运算的工具,尽管那会很棒,但我正在寻找一种实现这种简化的方法。

编辑:我对Electrical Engineering提出了类似的问题。

最佳答案

除了将其留给编译器使用之外,或者在我的答案的第二部分中使用手工编写的建议,还请参见HJLebbink使用FPGA逻辑优化工具的自我解答。 (此答案以赏金结尾,因为它未能吸引到任何其他人这样的答案;它并不是真正值得赏金的。://我在有赏金之前就写了它,但是没有其他有用的东西了。)

ICC18将链接的_mm512_and/or/xor_epi32内部函数优化为vpternlogd指令,但gcc/clang却没有。

On Godbolt,以及多次使用某些输入的更复杂的功能:

#include <immintrin.h>

__m512i logic(__m512i a, __m512i b, __m512i c,
               __m512i d, __m512i e, __m512i f, __m512i g) {
//     return _mm512_and_epi32(_mm512_and_epi32(a, b), c);
     return a & b & c & d & e & f;
}
gcc -O3 -march=skylake-avx512每晚构建
logic:
    vpandq  zmm4, zmm4, zmm5
    vpandq  zmm3, zmm2, zmm3
    vpandq  zmm4, zmm4, zmm3
    vpandq  zmm0, zmm0, zmm1
    vpandq  zmm0, zmm4, zmm0
    ret

ICC18 -O3 -march=skylake-avx512
 logic:
    vpternlogd zmm2, zmm0, zmm1, 128                        #6.21
    vpternlogd zmm4, zmm2, zmm3, 128                        #6.29
    vpandd    zmm0, zmm4, zmm5                              #6.33
    ret                                                     #6.33

当在不同的子表达式中多次使用每个变量时,IDK在选择最佳解决方案方面有多好的表现。

要查看它是否做得很好,您必须自己进行优化。
您想找到3个变量的集合,这些集合可以组合在一起成为一个 bool 值,而在表达式中的其他任何地方仍然不需要这3个变量。

我认为,具有3个以上输入的真值表可能不会这样简化,而对于较小的真值表,其中的一列是3个输入的三元组合的结果。例如我认为不能保证可以将4输入函数简化为vpternlog + AND,OR或XOR。

我绝对担心编译器可能会选择3个输入进行组合,而这些输入并不会像选择3个输入那样导致太多的简化。

对于编译器来说,从一对二进制运算或两个二进制运算开始以进行三进制运算甚至可能是最佳选择,特别是如果这样做可以实现更好的ILP。

您可能编写了一个蛮力的真值表优化程序,该程序查找变量的三元组,这些变量可以组合成一个较小的表,仅用于三元结果和表的其余部分。但是我不确定贪婪的方法是否可以保证达到最佳效果。如果有多种方法可以将相同的总指令数组合在一起,那么对于ILP (Instruction Level Parallelism)来说,它们可能并非全部等效。

关于boolean-logic - 真值表归结为三元逻辑运算,vpternlog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47537580/

相关文章:

python - 如何将德摩根定律应用于Python中的 boolean 表达式字符串?

assembly - 是否有用于 16 字节宽 VTBL 的 Armv8-A 内在函数?

C : 0 & 1 combinations using recursion

JavaFX - 数据绑定(bind) - 添加附加 BooleanBinding

javascript - 为什么 JavaScript 按位或行为异常?

c++ - 试图在 c++ 中制作一个简单的加法器。编译成功但输出错误

simd - "fixing up" float 是什么意思?

c - 未知的段错误问题

python - 在 python 中制作真值表

math - 计算 bool 表达式的简化乘积和