c - 相等或不重叠

标签 c optimization restrict-qualifier

假设一个函数将两个 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/

相关文章:

flash - 在 AS3 中获取对象的构造函数的最快方法是什么?

c - C99 'restrict' 关键字的实际用法?

c - 指针分配受限

c - 打印数组值,无地址

C on ARM - 等待 UART 接收

c - 删除我的 C 字符串前面的空格

MySQL group by 查询与子选择优化

C 枚举不返回未指定的值

java - 如何在 1 维和 n 维空间中有效地选择邻居进行模拟退火

兼容类型和参数类型限定符