gpt4 book ai didi

c - 相等或不重叠

转载 作者:太空宇宙 更新时间:2023-11-04 04:09:41 27 4
gpt4 key购买 nike

假设一个函数将两个 vector 相加

void add256(int* r, int* p, int* q) {
for (int i=0; i<256; ++i) {
r[i] = p[i] + q[i];
}
}

现在如果我知道 rp 或不在与 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com