Переписать код для удаления зависимости от цикла - PullRequest
1 голос
/ 28 марта 2019

Я пытаюсь переписать этот внешний цикл for, чтобы несколько потоков могли выполнять итерации параллельно. На самом деле, пока я просто хочу, чтобы два потока вычислили это, хотя более общее решение было бы идеальным. Проблема в том, что существует зависимость, переносимая в цикле: nval[j] добавляется к предыдущему значению nval[j] вместе со значением этой итерации avval.

void loop_func(Arr* a, int blen, double* nval) {
    // an Arr is a struct of an array and len field
    assert(a->len < blen);
    long long int i = 0, j = 0, jlo = 0, jhi = 0;
    double        avval = 0.0;

    for (i      = 0; i < blen; i++)
        nval[i] = 0.0;
    const double quot = static_cast<double>(blen) / static_cast<double>(a->len);
    for (auto i = 1; i < a->len - 1; i++) {
        j_lower = (int)(0.5 * (2 * i - 1) * quot);
        j_upper = (int)(0.5 * (2 * i + 1) * quot);
        printf("a->val index: %lld\t\tnval index: %lld-%lld\n", i, j_lower, j_upper);
        avval = a->val[i] / (j_upper - j_lower + 1);

        for (j = j_lower; j <= j_upper; j++) {
            nval[j] += avval;
        }
    }
}

Для удобства я распечатываю некоторые детали, которые были напечатаны с помощью printf выше.

a->val index: 1     nval index: 1-3
a->val index: 2     nval index: 3-5
a->val index: 3     nval index: 5-7
a->val index: 4     nval index: 7-9
a->val index: 5     nval index: 9-11
a->val index: 6     nval index: 11-13

В идеале я бы хотел, чтобы поток 1 обрабатывал индекс a-> val 1-3, а поток 2 обрабатывал индекс a-val 4-6.

Вопрос 1: Кто-нибудь может описать преобразование кода, которое устранит эту зависимость?

Вопрос 2: Существуют ли инструменты C / C ++, которые могут это сделать? Может быть, что-то построено с LLVM? Скорее всего, у меня будет несколько таких ситуаций, когда мне нужно будет выполнить параллельное выполнение. Точно так же, если есть общие методы, которые могут быть применены для удаления таких переносимых зависимостей, я бы хотел узнать об этом более широко.

...