Алгоритмы вилочного соединения с ompss

openMP/ompSs позволяет определять задачи с конкретными входами и выходами, чтобы можно было определить зависимости между различными задачами.

Большинство примеров, однако, показывают различные функции как задачи, связанные друг с другом через зависимости. А как насчет стандартной параллельной программы на основе? Можно ли определить зависимости, то есть среди итераций последовательных "параллельных для" регионов?

1 ответ

Вам не нужны функции для определения зависимостей.

Давайте возьмем, например, некоммутативную операцию, такую ​​как конкатенация, здесь inout Зависимость будет гарантировать, что задачи всегда выполняются в порядке.

char buf_n[11] = {0}, buf_l[11] = {0}, buf_u[11] = {0};
#pragma omp parallel
{
#pragma omp single
    {
        int i;
        for (i=0; i < 10; i++)
        {

#pragma omp task depend(inout:buf_n) firstprivate(i)
            {
                char add[] = {'0' + i};
                strncat(buf_n, add, 1);
            }

#pragma omp task depend(inout:buf_l) firstprivate(i)
            {
                char add[] = {'a' + i};
                strncat(buf_l, add, 1);
            }

#pragma omp task depend(inout:buf_u) firstprivate(i)
            {
                char add[] = {'A' + i};
                strncat(buf_u, add, 1);
            }

        }

#pragma omp task depend(in:buf_n)
        {
            printf("buf (numbers) is %s\n", buf_n);
        }
#pragma omp task depend(in:buf_l)
        {
            printf("buf (lowercase) is %s\n", buf_l);
        }
#pragma omp task depend(in:buf_u)
        {
            printf("buf (uppercase) is %s\n", buf_u);
        }
    }
}

Это всегда будет возвращать что-то вроде:

buf (lowercase) is abcdefghij
buf (uppercase) is ABCDEFGHIJ
buf (numbers) is 0123456789

Порядок строк может меняться, однако конкатенации всегда происходят по порядку (т. Е. Буквы и цифры всегда в правильном порядке).

Другие вопросы по тегам