Существует параллельное решение этой проблемы, но оно, вероятно, не стоит усилий.
Сначала мы определим операцию xchg(m, n)
над массивом a :
xchg(m, n) => ((a[m] > a[n] && a[n] != 0) || a[m] == 0) ? swap(a[m],a[n])
Эта операция сортирует два элемента 'm' и 'n' в порядке возрастания, если они оба содержат ненулевые значения, или заменяет их, если значение в элементе 'm' равно нулю.
Затем мы выполняем набор из пяти таких операций следующим образом:
xchg(0,2) xchg(1,3)
xchg(0,1) xchg(2,3)
xchg(1,2)
Сопряженные xchg
операции могут выполняться параллельно, что сокращает временные затраты на 40% по сравнению со строго последовательнымивыполнение.Когда мы закончим, все ненулевые элементы в массиве будут отсортированы в порядке возрастания.Элемент с наименьшим значением будет в [0].Если это значение равно нулю, в массиве нет ненулевых значений.
Это решение использует врожденный параллелизм, обеспечиваемый сетями сортировки (http://en.wikipedia.org/wiki/Sorting_network),, но также последовательно сканирует 4 элементаиспользует не более трех операций сравнения, и, что особенно важно, требует в среднем вдвое меньше операций записи в хранилище:
последовательное сканирование
int v = a[0]
for (n = 1; n < 4; n++) {
if ((a[n] < v && a[n] != 0 ) || v == 0) v = a[n]
}