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,
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中描述的语句类。它通常指这些语句的类;它不是对任何特定代码的引用。它不是校对单。这些是高性能计算中众所周知的问题。