Каковы несколько трудоемких операций в C?

Я хочу написать программу быстрого тестирования, которая может быть скомпилирована и запущена на разных машинах. Вместо того, чтобы использовать доступные в продаже/доступные с открытым исходным кодом опции, я бы предпочел, чтобы у меня было много возможностей для оптимизации потоков и алгоритмов.

У меня есть пара, которую я использую уже, которая включает в себя рекурсивно вычисление n-го числа последовательности Фибоначчи и посев /rand () в несколько тысяч раз.

Существуют ли какие-либо другие алгоритмы, относительно простые, но в то же время вычислительно-интенсивные (и, возможно, связанные с математикой)?

(обратите внимание, что эти операции будут реализованы на языке С.)

Ответы

Ответ 1

функция Ackermann обычно является забавной, но не давайте ей очень большие входы, если вы хотите, чтобы она закончилась в вашей жизни.

Ответ 3

Я знаю, что вы сказали, что хотите сделать свой собственный, но, возможно, вы могли бы использовать существующие тесты для вдохновения. Тест-драйв на компьютерном языке запустил множество языков программирования с помощью набора эталонных тестов. Возможно, вы можете получить некоторые идеи, глядя на их тесты.

Некоторые быстрые идеи в моей голове:

  • Матричное умножение: mulitplying 2 большие матрицы относительно вычислительно интенсивный, хотя вы необходимо будет учитывать кэширование

  • Генерация простых чисел

  • Целочисленная факторизация

  • Численные методы решения ОДУ - Runge-kutta например

Ответ 4

Инвертирование больших матриц.

Ответ 5

Вы можете вычислять большие простые числа или разделить целые числа.

Ответ 6

Взгляните на Параллельные тесты NAS. Они были первоначально написаны NASA в Fortran для суперкомпьютеров, использующих MPI (и все еще доступны именно так), но есть также C, Java, а также реализации OpenMP.

Большинство из них являются очень вычислительно интенсивными, поскольку они предназначены для представления численных алгоритмов, используемых в научных вычислениях.

Ответ 7

Попробуйте вычислить тысячи или миллионы pi цифр. Для этой задачи существует немало formulas.

Ответ 8

У вас есть действительно хорошие в project euler, все они связаны с математикой и могут занимать много времени, поскольку вы хотите использовать более высокие значения.

Ответ 9

Поиск простых чисел считается довольно трудоемким.

Ответ 10

Это добавляет много:

int c = 0; 
for (int n = 0; n < INT_MAX; n++)
    for (int m = 0; m < INT_MAX; m++)
        c++;

std::cout << c;

Ответ 11

Ознакомьтесь с эталонами перехвата языка: http://shootout.alioth.debian.org/

Однако: контрольные показатели - это только контрольные показатели и не обязательно много рассказывают о реальном мире и, напротив, могут вводить в заблуждение.

Ответ 12

Если вы хотите попробовать parallelism, выполните множество математических вычислений. Размер вашей матрицы, которую вы можете использовать, будет ограничен памятью, но вы можете делать столько итераций, сколько хотите.

Это подчеркнет инструкции SIMD, которые поставляются современными процессорами.

Ответ 13

Вы можете попробовать серию (Turbo Sort) с очень большим набором входных данных. Я понимаю, что это общая операция.

Ответ 14

Эвристика для NP-Complete проблемы - интересный способ получить некоторый процессорный код. Вы можете закодировать "решение":) для одного из Karps NP-Complete problems.