Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C/C++;支持自动矢量化编译器的程序?_C++_C - Fatal编程技术网

C++ 如何在C/C++;支持自动矢量化编译器的程序?

C++ 如何在C/C++;支持自动矢量化编译器的程序?,c++,c,C++,C,编程时要遵循一些规则,使程序易于编译器自动矢量化 其中一些规则包括: 无“中断”语句(循环应具有单流) 没有“如果”语句(只允许掩码赋值)和许多其他 如果知道可以采取什么步骤来替换这些条件中断语句,那就太好了 我想给出一个简单的例子,使其易于理解,但该程序可以包含许多“break”语句,这些语句通常取决于严格的条件和状态标志 考虑一个处理二维阵列的简单程序: void main() { int i,j,sum = 0; int array[3][5] = {{1,3,6,8,9},{23,65,

编程时要遵循一些规则,使程序易于编译器自动矢量化

其中一些规则包括:

  • 无“中断”语句(循环应具有单流)
  • 没有“如果”语句(只允许掩码赋值)和许多其他
  • 如果知道可以采取什么步骤来替换这些条件中断语句,那就太好了

    我想给出一个简单的例子,使其易于理解,但该程序可以包含许多“break”语句,这些语句通常取决于严格的条件和状态标志

    考虑一个处理二维阵列的简单程序:

    void main()
    {
    int i,j,sum = 0;
    int array[3][5] = {{1,3,6,8,9},{23,65,77,54,5},{2,5,-7,-89,-8}};
    for(i=0;i<3;i++)
    {
        for(j=0;j<5;j++)
        {
           sum += a[i][j];
           if(i==2 && j==2)
           {
               break;//breaks out of loop j
           }
        }
    }
    return 0;
    }
    
    void main()
    {
    int i,j,和=0;
    int数组[3][5]={{1,3,6,8,9},{23,65,77,54,5},{2,5,-7,-89,-8};
    对于(i=0;i
    如果知道可以采取什么步骤来替换这些条件中断语句,那就太好了

    一般来说,你不会

    循环中的
    break
    语句用于终止循环,通常基于循环的正常终止条件以外的条件。循环中通常内置一个终止条件,以及找到该条件的特定语法位置。因此,如果所讨论的代码编写得体,则
    break
    语句仅在附加终止条件无法合理添加到循环终止条件的情况下出现

    因此,如果我们谈论的代码是合理的(如果我们不是,那么矢量化是您最不担心的),那么重写它以将
    break
    条件折叠到循环条件中要么是直接不可能的,要么将导致极难遵循/维护的代码

    因此,一般来说,如果使用
    break
    是因为它是必要的,那么将其折叠到循环条件中是不可能/合理的。即使是这样,复杂的循环终止条件也可以像
    break
    语句一样有效地终止自动向量化


    大多数代码都不适合矢量化。您的小示例是不可矢量化的,因为它包含操作系统调用。矢量化通常适用于在值序列上循环并对其执行相当简单的操作。

    请共享您所指的代码。本着@cigien刚才说的是:你可以从实际编写代码开始。@cigien:问题不是指代码。它不是问具体的代码。它是问与高性能计算相关的原理和方法。请不要把堆栈溢出的每个问题都当作调试帮助请求或帮助请求关于1,如果一个循环不能有break语句,它必须只有一个流,那么该循环必须始终运行到完成。因此,问题是,即使它必须继续处理整个数组中的所有元素(或它迭代的任何其他元素),如何编写一个产生可接受结果的循环?正如您的问题提到的屏蔽赋值,一种是在循环结束后屏蔽所有不需要的赋值。另一种是找出或标记有用结果的结束位置。一种缓解方法是设计循环停止条件,以便在需要时提前停止。@JaMiT:“这些条件中断语句和if语句”指规则1和2中描述的语句类。它通常指这些语句的类;它不是对任何特定代码的引用。它不是校对单。这些是高性能计算中众所周知的问题。