ISPC 1.10

ISPCшные примеры, понятно что подобранные со вкусом, дают повод задуматься:

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. Приветы эти бывают нечасто, но случаются.