ISPC 1.10
C:\> deferred_shading.exe pp1920x1200.bin [ispc static + tasks]: [151.426] million cycles to render 1920 x 1200 image [C++ serial dynamic, 1 core]: [2883.776] million cycles to render image (19.04x speedup from ISPC) C:\>mandelbrot_tasks.exe [mandelbrot ispc+tasks]: [190.607] million cycles [mandelbrot serial]: [2133.784] millon cycles (11.19x speedup from ISPC) C:\> mandelbrot.exe [mandelbrot ispc]: [102.830] million cycles [mandelbrot serial]: [276.757] millon cycles (2.69x speedup from ISPC)
И если этот самый Deferred Shading (см. слайды 19-29) - реально здоровый и за 5 минут его не понять (но из общих соображений понятно, что графика - высокопараллельна и в пределе можно ожидать 8x от AVX и 4x от 4-х ядер), то с Мандельбротом все совсем просто:
- Простой (последний в списке) вариант - ISPC скармливается абсолютно тот же по смыслу код, что и C++. Отличия чисто технологические: чуть иначе написан цикл, добавлено слово uniform там где ему место.
- Вариант который ispc+tasks использует еще и многоядерность. Для этого пришлось написать еще целых 25 строк, описывающих раскладку подзадач, ну и использовать прилагаемый в примерах таск-менеджер.
Таск-менеджер в последней собранной версии (1.10, берут отсюда) работает, по идее, под Win32, Linux и MacOS, хотя пробовал я только под Win32.
Продолжаю рекомендовать штуку, это один из немногих на сегодня способов дешево получить и SIMD и multi-core для скалярного кода, не выпиливая вручную на ассемблере SIMD-инструкции. При этом, получаемый код работает с данными in-place, без мучительных clEnqueueBuffer (да, OpenCL - это второй способ сделать упомянутое выше).
Из минусов - отсутствие отладчика (и его, скорее всего, не будет никогда) и всякие приветы от LLVM-3-svn. Приветы эти бывают нечасто, но случаются.