Алгоритмы вилочного соединения с 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
Порядок строк может меняться, однако конкатенации всегда происходят по порядку (т. Е. Буквы и цифры всегда в правильном порядке).