Использование графической карты вместо GDI+ для управления изображениями
У меня есть вопрос, который может быть несбыточной мечтой, но я хотел знать, может ли кто-нибудь из моих коллег Stack Overflow'ов помочь мне в этом.
В компании, в которой я работаю, мы выполняем миллиарды манипуляций с изображениями каждый месяц. По сути, мы берем массивное изображение, разрезаем его на квадратные изображения размером 256 пикселей, квантуем их по цвету и сохраняем как png - и переходим к следующему гигантскому изображению. Мы используем ряд методов, чтобы сделать это как можно быстрее, и в настоящее время это очень быстро, но я думаю, что есть шанс, что мы сможем сделать его звездным по скорости.
Само приложение является.Net 2.0, циклически перебирает различные байты в большом изображении, считывает байты для каждого меньшего изображения и использует GDI для сохранения изображения после того, как оно прошло через алгоритм квантования. У нас есть десятки машин, которые запускают это приложение, и все они имеют видеокарты Nvidia Geforce 8 (или лучше).
Есть ли способ, которым я могу использовать графический процессор вместо центрального процессора для выполнения любой или всех вышеуказанных задач? Если да, то как мне это сделать? К сожалению, я никогда не кодировал ничего подобного раньше, поэтому, если кто-то может мне помочь, мне может понадобиться объяснение достаточно тщательно (и медленно).
2 ответа
Несколько технологий для изучения:
Компоненты Windows Imaging. это не совсем то, что вам нужно, поскольку я не думаю, что он использует графический процессор (хотя я мог бы быть вонгом), но он должен быть значительно быстрее, чем GDI +.
Direct2D. он использует графический процессор для многих операций рисования и хорошо интегрируется с компонентами обработки изображений Windows. но из вашего описания не ясно, соответствуют ли операции рисования, оптимизированные графическим процессором, именно тем, что вам нужно.
Вдобавок к этому вы можете попробовать использовать пиксельные шейдеры для манипулирования изображениями. это область, в которую я не углубился, поэтому я оставлю это для других, чтобы комментировать.
Другими словами, компоненты обработки изображений Windows должны значительно уменьшить узкое место загрузки / сохранения PNG. операции, которые он предоставляет, вероятно, также помогут разрезать изображение гораздо более оптимальным способом, чем GDI+. Direct2D и / или пиксельный шейдер должны помочь с манипулированием на уровне пикселей. пиксельный шейдер необходим только в том случае, если нет более прямого способа выполнить операцию квантования цветов, необходимую для изображений.
Определить массивно? (Другими словами, массивный относительный.)
Можно использовать CUDA - графические процессоры NVIDIA -
http://developer.download.nvidia.com/compute/cuda/sdk/website/projects/dxtc/doc/cuda_dxtc.pdf