Разгон Мандельброта: SIMD с бубнами, OpenMP и CUDA
Построение множества Мандельброта — классический пример чрезвычайно параллельной задачи (embarrassingly parallel problem).
На первом курсе я впервые столкнулся с такой проблемой: тогда мы изучали SIMD-инструкции в курсе архитектур вычислительных систем. Эта тема сразу меня увлекла, и я захотел углубиться в дальнейшие оптимизации, но в течение семестра мне не хватало ни времени, ни знаний. Спустя год я решил восполнить этот пробел.
Вначале мы разберем наивную реализацию, поиграемся с интринсиками (intrinsics) и, не теряя переносимости, заставим компилятор генерировать нам SIMD-инструкции. Далее добавим многопоточность и в заключение обесценим все наши старания несколькими строчками на CUDA.
Возможно, эта статья поможет таким же, как я, впервые столкнувшимся с подобными задачами.
Читать далее