在 C 中的向量加法运算中,编译器要读取的第一个向量是什么?
What is the first vector to be read by the compiler in a vector addition operation in C?
我在分析一段代码的缓存操作,出现了这个问题:
C[i] = B[i] + A[i];
G[i] = x*F[i];
这是我有疑问的代码部分。上下文:我的缓存内存有 space 这 5 个向量中的最多 4 个。它与 LRU 算法(最近最少使用)一起工作,因此 C、B、A 和 F 存储时有任何问题,但 G 在缓存中没有 space 因此最长时间未使用的向量是替换为 G 的向量值。以下是问题:
第一个是A还是B? C 编译器根据什么原则来决定首先读取哪个元素?这取决于所使用的编译器(GCC、ICC...)还是它们通常都遵循相同的规则?
在 C[i] = B[i] + A[i];
中,编译器可能首先加载 A[i]
或首先加载 B[i]
。 C 标准对此排序没有任何要求。
G[i] = x*F[i];
之后,编译器必须在存储C[i]
之后加载F[i]
,除非它可以确定F[i]
与[=15不是同一个对象=].如果它可以确定,那么它可以按任何顺序加载 A[i]
、B[i]
和 F[i]
。
同理,如果可以判断G[i]
不与C[i]
重叠,则可以按任意顺序存储C[i]
和G[i]
。
如果此代码出现在循环中,则这种允许的重新排序会扩展到循环迭代之间的元素:如果编译器可以确定它不会影响定义的结果,它可以从“加载 B[i]
例如,在为当前迭代加载 A[i]
之前。它可以从 B
加载四个元素,从 A
加载四个元素,从 F
加载四个元素,并在将任何元素存储到 C
或 [=31 之前执行所有算术运算=]. (通常编译器没有数组重叠的必要信息,所以它不会重新排序,除非你以某种方式给它这个信息,比如用 restrict
声明指针或使用特殊的 pragmas 或编译器内置-ins 告诉它这些事情。)
通常,C 标准对于实际操作的排序方式是宽松的。它只要求满足它指定的可观察行为。您不应期望仅根据标准 C 代码首先加载任何特定元素。
我在分析一段代码的缓存操作,出现了这个问题:
C[i] = B[i] + A[i];
G[i] = x*F[i];
这是我有疑问的代码部分。上下文:我的缓存内存有 space 这 5 个向量中的最多 4 个。它与 LRU 算法(最近最少使用)一起工作,因此 C、B、A 和 F 存储时有任何问题,但 G 在缓存中没有 space 因此最长时间未使用的向量是替换为 G 的向量值。以下是问题:
第一个是A还是B? C 编译器根据什么原则来决定首先读取哪个元素?这取决于所使用的编译器(GCC、ICC...)还是它们通常都遵循相同的规则?
在 C[i] = B[i] + A[i];
中,编译器可能首先加载 A[i]
或首先加载 B[i]
。 C 标准对此排序没有任何要求。
G[i] = x*F[i];
之后,编译器必须在存储C[i]
之后加载F[i]
,除非它可以确定F[i]
与[=15不是同一个对象=].如果它可以确定,那么它可以按任何顺序加载 A[i]
、B[i]
和 F[i]
。
同理,如果可以判断G[i]
不与C[i]
重叠,则可以按任意顺序存储C[i]
和G[i]
。
如果此代码出现在循环中,则这种允许的重新排序会扩展到循环迭代之间的元素:如果编译器可以确定它不会影响定义的结果,它可以从“加载 B[i]
例如,在为当前迭代加载 A[i]
之前。它可以从 B
加载四个元素,从 A
加载四个元素,从 F
加载四个元素,并在将任何元素存储到 C
或 [=31 之前执行所有算术运算=]. (通常编译器没有数组重叠的必要信息,所以它不会重新排序,除非你以某种方式给它这个信息,比如用 restrict
声明指针或使用特殊的 pragmas 或编译器内置-ins 告诉它这些事情。)
通常,C 标准对于实际操作的排序方式是宽松的。它只要求满足它指定的可观察行为。您不应期望仅根据标准 C 代码首先加载任何特定元素。