1

假设一个添加两个向量的函数

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

现在,如果我知道r与和p是否在同一个数组中,是否可以帮助使用并行添加指令优化代码?pqrestrict


我问这个问题是因为在 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 分离的情况做同样的事情

4

1 回答 1

0

当你使用 时restrict,你向编译器做出了一个承诺。违背承诺会导致未定义的行为。

我解释你的问题的方式是指针要么相同,要么根本不重叠。在这种情况下,您可以像这样优化:

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];
        }
    }
}

但是,当然,您应该运行测试以查看它是否可以提高性能。毕竟,这确实会带来一些开销。

于 2019-11-04T13:04:50.220 回答