假设一个函数将两个 vector 相加
void add256(int* r, int* p, int* q) {
for (int i=0; i<256; ++i) {
r[i] = p[i] + q[i];
}
}
现在如果我知道 r
是 p
或不在与 p
相同的数组中,并且与 q
相同code>, restrict
是否可以帮助优化并行添加指令的代码?
我问这个问题是因为,在 GCC 上,
typedef struct { int x[256]; } int256;
void add256t(int256* r, int256* p, int256* q) {
for (int i=0; i<256; ++i) {
r->x[i] = p->x[i] + q->x[i];
}
}
可以根据完全假设的条件和我想要的 asm 进行优化,但是在不同的情况下分离会使代码变得一团糟,而 asm 分离的情况做同样的事情
最佳答案
当您使用restrict
时,您向编译器做出了 promise 。违背 promise 会导致未定义的行为。
我解释您的问题的方式是指针相同或根本不重叠。在这种情况下,您可以这样优化:
void add256_rEQp(int restrict *r, int restrict *q) {
for (int i=0; i<256; ++i) {
r[i] += q[i];
}
}
void add256(int* r, int* p, int* q) {
if(r == p && r != q)
add_256rEQp(r, q);
else if( ...
else {
for (int i=0; i<256; ++i) {
r[i] = p[i] + q[i];
}
}
}
当然,您应该运行测试以查看它是否提高了性能。毕竟,这确实会带来一些开销。
关于c - 相等或不重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58680058/