Я пытаюсь построить параллельный алгоритм с CUDA, который принимает массив целых чисел и удаляет все 0
с сохранением заказа или без него.Алгоритм сжатия потока CUDA
Пример:
Глобальная память: {0, 0, 0, 0, 14, 0, 0, 17, 0, 0, 0, 0, 13}
Хост Результат Память: {17 , 13, 14, 0, 0, ...}
Самый простой способ - использовать хост для удаления 0
в O(n)
времени. Но учитывая, что у меня есть около 1000
элементов, вероятно, будет быстрее оставить все на графическом процессоре и сначала сконденсировать его, прежде чем отправлять его.
Предпочтительным методом было бы создание стека на устройстве, чтобы каждый поток мог выталкивать и вставлять (в любом порядке) в стек или из него. Тем не менее, я не думаю, что CUDA реализует это.
Эквивалентный (но гораздо медленнее) метод будет продолжать пытаться писать, пока все нити не дописал:
kernalRemoveSpacing(int * array, int * outArray, int arraySize) {
if (array[threadId.x] == 0)
return;
for (int i = 0; i < arraySize; i++) {
array = arr[threadId.x];
__threadfence();
// If we were the lucky thread we won!
// kill the thread and continue re-reincarnated in a different thread
if (array[i] == arr[threadId.x])
return;
}
}
Этот метод только на пользу в том, что мы хотели бы выступать в O(f(x))
время, где f(x)
это среднее число ненулевых значений находятся в массиве (f(x) ~= ln(n)
для моей реализации, таким образом O(ln(n))
времени, но имеет высокую O
постоянные)
Наконец, алгоритм сортировки, такие как быстрая сортировка или слияние также решить про и фактически работает в O(ln(n))
относительное время. Я думаю, что может быть алгоритм быстрее, чем этот, даже если нам не нужно тратить время на упорядочение (свопинг) пар нулевого нуля и ненулевые пары ненулевых элементов (порядок не нужно хранить).
Так что я не совсем уверен, какой метод был бы самым быстрым, и я все еще думаю, что есть лучший способ справиться с этим. Какие-либо предложения?
Алгоритм является уплотнением потока вызовов, и это решаемая проблема с хорошими теоретическими анализами и несколькими очень высокими характеристиками реализации полки, доступной с помощью поисковой системы по вашему выбору. – talonmies
Спасибо за ссылку, google получил меня отсюда –