Я тоже руководствовался этим ответом, но надо бы декомпилировать System.Numerics. Я этого не сделал из-за того, что рефлектор с первого раза неймспейс не подцепил :)
Я пытался параллелить только корень, но это уже даёт 100% загрузку процессора. В идеале, распаралеливание, на 4 потока может дать только 4х кратный прирост.
Узким местом, впрочем, оказалось умножение последнего элемента — при любая финальной комбинация вызывается за 0.54 секунды
Собственно вот (однократная проверка, быстродействие, по наблюдениям, плавает в пределах 5%):
C# использует алгоритм Карацубы для умножения длинных чисел.
Но умножение, как мне показалось, реализовано крайне неэффективно. Собственно, тот же битовый сдвиг даёт прирост скорости почти в 2 раза для финальной операции. Собственно большенство плясок там именно вокруг этого.
Для того, чтобы скомпилировать код можно обойтись одним .NET Framework'ом, но лучше — какую-нибудь Visual Studio с поддержкой C#. Скинуть код смогу только этак в 22:00 МСК
А как этот фреймворк параллелит длинное умножение? Мне просто интересно, откуда 20ти кратный прирост, что я упустил
И не смогли бы вы запустить на вашей машине оригинальный код?
Измерить время можно с помощью System.Diagnostics.Stopwatch. Либо я могу скинуть тестовый код
Нет, вру. Нашёл упоминание поиском по странице в названии статьи. Но как его скачать — всё равно не понятно.
Вот вы жаловались, что CppCat крайне не популярен и никто его не покупает. Знаете что? Никто просто не знает о его существовании.
Когда я зашёл на страницу, я ожидал увидеть нечто вроде раздела «Other products» (например — в верхнем меню), где бы и находился CppCat. Но — нет.
Надо заметить, что полноценного 3d звука я не слышал со времён Win XP. Не то, что бы я много играю в современные игры, но в тех, что я запускал — 3d звук работал из рук вон плохо.
Это Microsoft, детка. В Windows 8 субпиксельное сглаживание отключено и ничего.
Игра с «поддержкой EAX» — это каждая первая игра, использующая Direct Sound и запученная на Windows XP. Microsoft просто заменил хардварную обработку звука через EAX на софтварную.
Убитость софтварного микширования звуков в том, что, во-первых, оно тратит ресурсы ЦП а во-вторых — в качестве результата. Дистретная звуковуха это делает лучше в силу специализации, закрытости исходных кодов прошивки (соответственно, фичу, о который ты не знаешь, не воспроизвести), узкоспециализированных процессоров, а так же из-за патентов, находящихся у компаний-разработчиков дискретных звуковых карт (Тот же самый Creative).
WASAPI миксуется софтварно, если я не ошибаюсь. ASIO — это вывод смиксованного звука — «телепорт к аудиовыходу», если можно так выразиться. Для 3D звука он не применим.
В общем от этого шага пострадали именно геймеры с оборудованием лучше среднего. А так же люди, профессионально занимающиеся обработкой звука в Windows
И эффекты тоже. Значительно ухудшилось качество 3D звука на дискретных картах (У меня Sound Blaster Audigy SE была тогда)
Играл я когда-то в Aion, как раз в момент перехода с Win XP на Win 7 — разница кардинальная. В Win 7 очень не хватает глубины (в буквальном смысле) при расположении звуков в 3D сцене. Значительно труднее понять насколько далеко от тебя находится источник и сзади он или спереди. Про само звучание я даже не говоню.
Где этот раздел находится? От текста на фоне текста на фоне анимации просто вытекают глаза, а мозг плавится в попытках понять в увиденном буквы. Что характерно, не понимает Оо.
Мне на await/async удалось получить ускорение порядка 3.5 раза на 4х ядрах, но там есть пара извращений.
Узким местом, впрочем, оказалось умножение последнего элемента — при любая финальной комбинация вызывается за 0.54 секунды
Собственно вот (однократная проверка, быстродействие, по наблюдениям, плавает в пределах 5%):
2-25000: 00:00:00.2458574 // thread 1
25001-50000: 00:00:00.3246583 // thread 2
finalizing: 00:00:00.5395141
total: 00:00:00.8882113
C# использует алгоритм Карацубы для умножения длинных чисел.
Но умножение, как мне показалось, реализовано крайне неэффективно. Собственно, тот же битовый сдвиг даёт прирост скорости почти в 2 раза для финальной операции. Собственно большенство плясок там именно вокруг этого.
Для того, чтобы скомпилировать код можно обойтись одним .NET Framework'ом, но лучше — какую-нибудь Visual Studio с поддержкой C#. Скинуть код смогу только этак в 22:00 МСК
И не смогли бы вы запустить на вашей машине оригинальный код?
Измерить время можно с помощью System.Diagnostics.Stopwatch. Либо я могу скинуть тестовый код
У меня получилось вот так:
Naive
2,214s
Tree
1,118s
OptimizedThreading
0,273s
Время — среднее за 10 проходов, каких-то исключительных пиков не наблюдалось в отдельных методах
Система — Core i5 2500, Win7 x64
Другими словами — мне дописывать статью, или уже бессмысленно? :)
2-25000: 00:00:00.2458574
25001-50000: 00:00:00.3246583
finalizing: 00:00:00.5395141
total: 00:00:00.8882113
И быстрее 0.54 получить не получится ну никак.
_https://gist.github.com/krypt-lynx/4326359b748c5f4b9cc8
const int threadCount = 2; static Task<BigInteger> AsyncProdTree(int l, int r) { return Task<BigInteger>.Run(() => ProdTree(l, r)); } static BigInteger FactThreadingTree(int n) { if (n < 0) return 0; if (n == 0) return 1; if (n == 1 || n == 2) return n; if (n < threadCount+1) return ProdTree(2, n); Task<BigInteger>[] tasks = new Task<BigInteger>[threadCount]; tasks[0] = AsyncProdTree(2, n / threadCount); for (int i = 1; i < threadCount; i++) { tasks[i] = AsyncProdTree(((n / threadCount) * i) + 1, (n / threadCount) * (i + 1)); } Task<BigInteger>.WaitAll(tasks); BigInteger result = 1; for (int i = 0; i < threadCount; i++) { result *= tasks[i].Result; } return result; }
FactNaive: 2.2
FactTree: 1.1
FactFactor: 1.1
FactThreadingTree: 0.9
Вот вы жаловались, что CppCat крайне не популярен и никто его не покупает. Знаете что? Никто просто не знает о его существовании.
Когда я зашёл на страницу, я ожидал увидеть нечто вроде раздела «Other products» (например — в верхнем меню), где бы и находился CppCat. Но — нет.
Игра с «поддержкой EAX» — это каждая первая игра, использующая Direct Sound и запученная на Windows XP. Microsoft просто заменил хардварную обработку звука через EAX на софтварную.
Убитость софтварного микширования звуков в том, что, во-первых, оно тратит ресурсы ЦП а во-вторых — в качестве результата. Дистретная звуковуха это делает лучше в силу специализации, закрытости исходных кодов прошивки (соответственно, фичу, о который ты не знаешь, не воспроизвести), узкоспециализированных процессоров, а так же из-за патентов, находящихся у компаний-разработчиков дискретных звуковых карт (Тот же самый Creative).
WASAPI миксуется софтварно, если я не ошибаюсь. ASIO — это вывод смиксованного звука — «телепорт к аудиовыходу», если можно так выразиться. Для 3D звука он не применим.
В общем от этого шага пострадали именно геймеры с оборудованием лучше среднего. А так же люди, профессионально занимающиеся обработкой звука в Windows
Играл я когда-то в Aion, как раз в момент перехода с Win XP на Win 7 — разница кардинальная. В Win 7 очень не хватает глубины (в буквальном смысле) при расположении звуков в 3D сцене. Значительно труднее понять насколько далеко от тебя находится источник и сзади он или спереди. Про само звучание я даже не говоню.
Подробности есть в этой статье: habrahabr.ru/post/115092/