Комментарии 9
Кажется ли вам что объемная картина?
Мне кажется, что в ней есть движение :-) Особенно если при взгляде на неё двигать глазами в разные стороны.
почему так мало знают о множество Мандельброта?
Как минимум 6 статей про это есть на Хабре:
https://habr.com/ru/companies/ddosguard/articles/881360/
https://habr.com/ru/articles/525982/
https://habr.com/ru/companies/skillfactory/articles/509542/
https://habr.com/ru/companies/sberbank/articles/957194/
Первая - Ваша же, но тем не менее. Материалы на эту тему есть, и немало. А если запустить поиск, их найдётся ещё больше.
Вот полный код на языке С++:
Во-первых, хорошим тоном считается либо выкладывание кода в какой-нибудь репозиторий, либо его можно хотя бы под спойлер убрать. Во-вторых, вижу, что теперь код у Вас даже как-то отформатирован, но не весь. Почему бы весь его не отформатировать? Это облегчает чтение на порядок.
#include <gmp.h>
#include <mpfr.h>
Неплохо бы для сторонних библиотек указывать, откуда их брать. Иначе программа просто не скопмилируется.
"Во-первых, хорошим тоном считается хотя бы под спойлер убрать" - я сделал!
Вы абсолютно правы, спасибо за точное замечание! Библиотеки длинной арифметики GNU MPFR и GNU GMP не входят в стандартный комплект компилятора, и перед запуском команды сборки их действительно нужно установить в систему.
Чтобы у всех всё компилировалось без проблем, вот команды для их установки:
Для Windows (в среде MSYS2 / UCRT64):
pacman -S mingw-w64-ucrt-x86_64-mpfr mingw-w64-ucrt-x86_64-gmpДля Linux (Ubuntu / Debian):
sudo apt-get install libmpfr-dev libgmp-dev
После этого указанная в статье команда g++ отработает идеально!
"Весь его отформатировать? Это облегчает чтение на порядок." - я тоже сделал!!! Ура!
обеспечивая безупречную 100%-ю загрузку процессора как на 4-ядерном ноутбуке, так и на 128-ядерном высокопроизводительном сервере
Программа реально умеет порождать 128 потоков на 128-ядерном сервере?
Да, программа абсолютно честно и гарантированно умеет порождать хоть 128, хоть 256 потоков на многоядерных серверах. И делает она это автоматически, «из коробки», без какого-либо хардкода.
В коде, который мы с вами отформатировали, количество рабочих потоков вычисляется вот этой строчкой:
unsigned int numThreads = std::thread::hardware_concurrency();
if (numThreads == 0) numThreads = 4;Функция стандартной библиотеки C++ std::thread::hardware_concurrency() делает системный вызов к операционной системе и возвращает точное количество доступных логических ядер (включая Hyper-Threading). На 128-ядерном сервере (например, на двухпроцессорном AMD EPYC) она вернет ровно 128 (или 256, если включен SMT).
Затем в цикле инициализации:
for (unsigned int t = 0; t < numThreads; ++t) {
renderWorkers.emplace_back([&]() { ... });
}Движок создает ровно numThreads (то есть 128) независимых операционных потоков ОС.
if (numThreads == 0) numThreads = 4; — это обычная подстраховка (fallback). Если система вернула ноль (по какой-то причине не смогла определить число ядер), код принудительно назначает 4 потока, чтобы программа просто не упала и запустилась хотя бы в 4 потока.

Множество Мандельброта — объемная картина? Выпуклая? И почему из 120 картин кажутся только две?