如何将一系列if / else if / else if /关系链转换为线性循环代码

格雷戈里

我有一个算法的核心,我想将本质上一系列大约20深度的if / else if / else if / else i /链转换为可以线性进行的循环。条件条件很简单,具有以下四种可能性之一(A [i] <B [j]),(A [i] <= B [j]),(A [i]> B [j]),(A [ i]> = B [j])。如何将它们全部转换为单个条件。例如,链条可能是这样的。

if (A[i+0] <  B[j+0]) break
if (A[i+1] <= B[j+1]) break
if (A[i+2] >  B[j+2]) break
if (A[i+3] >= B[j+3]) break
if (A[i+4] >= B[j+4]) break
....

每个条件可能是4个中的1个,但是我想将它们全部转换为一组单独的步骤而没有任何情况,以便可以在循环中完成(或可能与向量内在函数并行进行)

// Given a list R[n] of 4 possible relations loop over all the data
int result = 1;
for (i = 0; i < num_relations && result; ++i) {           
       // How do I convert this to linear code which does the equivalent of
       // (the value of R[n] and what relation it maps is flexible, this is an example)
       case (R[n]) {
          0 : result = A[i] <  B[i]; break;
          1 : result = A[i] <= B[i]; break;
          2 : result = A[i] >  B[i]; break;
          3 : result = A[i] >= B[i]; break;
       }
}

可能使用的(无符号数字)某些属性是

(A > B) ^ 1 === (A <= B) ^ 0

可以优化以上内容吗

result = 1;
for (i = 0; i < num_relations && result; ++i) {           
   result = ((A[i] <  B[i]) && (R[i] == 0)) ||
            ((A[i] <= B[i]) && (R[i] == 1)) ||
            ((A[i] >  B[i]) && (R[i] == 2)) ||
            ((A[i] >= B[i]) && (R[i] == 3));
}
cmaster-恢复莫妮卡

没有向量化,您的if()序列将尽可能快。在这种情况下,每个条件必须有一个比较指令,但您无法解决它(即使有些机器可以优化分支而不是一个)。

使用矢量化,您可以并行执行多个比较,前提是它们都必须在同一方向上。但这可以通过转换输入值来实现:

int signs[] = {1, 1, -1, -1, -1, ...};
int equals[] = {0, 1, 0, 1, 1, ...};
if (A[i+0] <  signs[0]*B[j+0] + equals[0]) break;
if (A[i+1] <  signs[1]*B[j+1] + equals[1]) break;
if (A[i+2] <  signs[2]*B[j+2] + equals[2]) break;
if (A[i+3] <  signs[3]*B[j+3] + equals[3]) break;
if (A[i+4] <  signs[4]*B[j+4] + equals[4]) break;
...

但是,此代码的矢量化将失败,因为要求编译器A[i+1]在评估第一个条件且显示为不满足之前从内存中加载因此,您需要使条件评估彼此不依赖:

int signs[] = {1, 1, -1, -1, -1, ...};
int equals[] = {0, 1, 0, 1, 1, ...};
int doBreak = 0;
doBreak |= (A[i+0] <  signs[0]*B[j+0] + equals[0]);
doBreak |= (A[i+1] <  signs[1]*B[j+1] + equals[1]);
doBreak |= (A[i+2] <  signs[2]*B[j+2] + equals[2]);
doBreak |= (A[i+3] <  signs[3]*B[j+3] + equals[3]);
doBreak |= (A[i+4] <  signs[4]*B[j+4] + equals[4]);
...
if(doBreak) break;

现在,您可以自由地进行循环。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C - 一系列 if 语句与 else if 时间测量

来自分类Dev

将if ... else语句转换为for循环

来自分类Dev

将if ... else语句转换为for循环

来自分类Dev

嵌套if ... else语句如何胜过一系列C ++中的单选if语句

来自分类Dev

如何将这些If else语句转换为Switch语句

来自分类Dev

如何将三元数转换为if / else?

来自分类Dev

将多个if-else逻辑转换为for循环

来自分类Dev

PowerShell将if else语句转换为Foreach循环

来自分类Dev

切换或Foreach替换一系列if-else语句?

来自分类Dev

将Lambda函数转换为if else语句

来自分类Dev

将 if else 转换为 switch 语句

来自分类Dev

将 if/else 转换为 JS/jQuery

来自分类Dev

如何将一系列索引/类别转换为分类数组

来自分类Dev

如何将一系列数组转换为2D numpy数组

来自分类Dev

如何将一系列嵌套列表转换为Miller Columns?

来自分类Dev

如何将一系列unicode字符转换为可读文本?

来自分类Dev

如何将一系列数值数据转换为特定的分类数据?

来自分类Dev

如何将一系列unicode字符转换为可读文本?

来自分类Dev

如何将div中的内容转换为一系列变量?

来自分类Dev

如何将一系列 PNG 图像转换为 YouTube 视频?

来自分类Dev

如何将一系列 For 循环块缩短为一个

来自分类Dev

如何将一系列键替换为使用 javascript 显示的字符串?

来自分类Dev

如何将If / Else切换到For循环?

来自分类Dev

如何基于一系列if \ else条件和匹配值从多个数据帧中最佳提取信息?(需要指导!)

来自分类Dev

((Java)if / else if / else循环后的返回语句?

来自分类Dev

((Java)if / else if / else循环后的返回语句?

来自分类Dev

将 for 循环与 if-else 语句结合使用

来自分类Dev

合并IF / Else系列

来自分类Dev

如何将一系列数学约束转换为 SAT 或 SMT 问题并得到答案?

Related 相关文章

  1. 1

    C - 一系列 if 语句与 else if 时间测量

  2. 2

    将if ... else语句转换为for循环

  3. 3

    将if ... else语句转换为for循环

  4. 4

    嵌套if ... else语句如何胜过一系列C ++中的单选if语句

  5. 5

    如何将这些If else语句转换为Switch语句

  6. 6

    如何将三元数转换为if / else?

  7. 7

    将多个if-else逻辑转换为for循环

  8. 8

    PowerShell将if else语句转换为Foreach循环

  9. 9

    切换或Foreach替换一系列if-else语句?

  10. 10

    将Lambda函数转换为if else语句

  11. 11

    将 if else 转换为 switch 语句

  12. 12

    将 if/else 转换为 JS/jQuery

  13. 13

    如何将一系列索引/类别转换为分类数组

  14. 14

    如何将一系列数组转换为2D numpy数组

  15. 15

    如何将一系列嵌套列表转换为Miller Columns?

  16. 16

    如何将一系列unicode字符转换为可读文本?

  17. 17

    如何将一系列数值数据转换为特定的分类数据?

  18. 18

    如何将一系列unicode字符转换为可读文本?

  19. 19

    如何将div中的内容转换为一系列变量?

  20. 20

    如何将一系列 PNG 图像转换为 YouTube 视频?

  21. 21

    如何将一系列 For 循环块缩短为一个

  22. 22

    如何将一系列键替换为使用 javascript 显示的字符串?

  23. 23

    如何将If / Else切换到For循环?

  24. 24

    如何基于一系列if \ else条件和匹配值从多个数据帧中最佳提取信息?(需要指导!)

  25. 25

    ((Java)if / else if / else循环后的返回语句?

  26. 26

    ((Java)if / else if / else循环后的返回语句?

  27. 27

    将 for 循环与 if-else 语句结合使用

  28. 28

    合并IF / Else系列

  29. 29

    如何将一系列数学约束转换为 SAT 或 SMT 问题并得到答案?

热门标签

归档