GPU Gems 2 Chapter 46 описывает сортировку на графическом процессоре.
Рассмотрим, как можно использовать алгоритм Бурлящий сортировки:
Заходя все N пикселей столбца для сортировки по каждому выходному пикселю, то это будет очень медленно, так как каждый выходной пиксель считывает N (с N^2 - сильно зависит от кеширования), и это большой доступ к памяти. Но это сработает, и этот код может действительно иметь смысл.
Если вы получаете доступ только к 2 входным пикселям на выходной пиксель, то вы можете эффективно «поменять» пару соседних пикселей на каждом проходе. Это может потребовать до N проходов, чтобы вытеснить пиксель N шагов. (Вы можете рассчитывать свопы и «ломаться» раньше, используя запрос окклюзии)
С помощью сочетания методов вы можете пробовать k пикселей за раз, позволяя пикселю перемещаться до k шагов за проход, что требует N/k проходов и более эффективно использовать ресурсы.
Но настоящие высокопроизводительные решения исходят от реализации более интеллектуальных алгоритмов, чем просто сортировка пузырьков. Статья GPU Gems предлагает битническую сортировку слияния, и даже с использованием кучи и быстрой сортировки возможны с большой утонченностью.
Но есть много чего знать, чтобы успешно создать эффективную реализацию для алгоритма GPU - больше, чем можно здесь в целом обсуждать. И вы можете захотеть перейти к реализации CUDA, а не glsl. Но тогда есть банковские конфликты, перекосы, кеширование, выборка, swizzling. Нет быстрого ответа.
Я предлагаю вам попробовать, а затем задать более конкретный вопрос, когда вы застряли.
Вы хотите использовать OpenGL или GPU? Для этого случая лучше использовать OpenCL или CUDA. Хотите реализовать срединный фильтр? – Unick
Не имеет значения, я использую openframeworks, поэтому все, что поддерживается там, было бы замечательно: D. – polyclick