Ответы пользователя по тегу Программирование
  • Где найти задачу на распределенные вычисления?

    ErmIg
    @ErmIg
    Программист
    У вас неправильный порядок действий. Надо было не решать абстрактную задачу путем распределенных вычислений, а потом искать куда бы ее можно применить. Правильный путь, хотя конечно это мое сугубо личное мнение, это при наличии реальной задачи - пытаться ускорить ее при помощи распределенных вычислений, если это конечно требуется и если это возможно. Потому как все задачи разные в плане требований к вычислительным ресурсам, памяти, возможности распараллеливания. И потому не возможно создать систему одинаково эффективную для них всех.
    Ответ написан
  • Есть ли основные правила супер оптимизации?

    ErmIg
    @ErmIg
    Программист
    Есть развернутый ответ для С++ кода, но его можно обобщить и на другие языки и платформы:

    Если приложение уже написано, то для начала следует с помощи профилировщика найти в программе узкие места (участки кода, на выполнение которых тратится наибольшее количество времени). Когда такие участки найдены, то можно приступать к их оптимизации. Важно помнить, что, как правило, любая оптимизация ухудшает читаемость кода, потому не следует заниматься оптимизацией там, где это непосредственно не требуется. В процессе оптимизации легко можно совершить ошибки, потому очень желательно перед оптимизацией обложить оптимизируемый функционал юнит-тестами.

    1) Важно понимать, что алгоритмическая оптимизация практически всегда может дать лучший эффект, чем программная. Так, если алгоритм имеет сложность O(n^2), то на больших исходных данных он при любой оптимизации будет медленнее, чем неоптимизированный алгоритм сложности O(n). Впрочем, при выборе алгоритма, опираться только на его сложность не стоит: если объем исходных данных не велик, то вполне может оказаться, что алгоритм со сложностью O(n^2) будет работать быстрее, чем с O(n).
    2) Очень важно повторное использование (кеширование) промежуточных данных, вычисленных в программе – ибо быстрее всего выполняется работа, которую не надо делать. Тем не менее, не надо чрезмерно кешированием увлекаться – если объем кэшируемых данных слишком велик, то это может отрицательно сказаться на общей производительности программы (некоторые данные быстрее вычислять на лету, чем считывать из памяти).
    3) Следует избегать излишнего копирования данных (например, передавать сложные типы данных по ссылке, а не по значению).
    4) По возможности следует избегать условных операторов во вложенных циклах. Так как условные переходы, вызываемые такими операторами, плохо обрабатываются современными процессорами с конвейерной архитектурой.
    5) Данные в памяти, которые используются алгоритмами, должны по возможности лежать упорядочено, и использоваться последовательно. Это позволит процессору их эффективно кешировать. Важно помнить, что доступ к кэшу процессора значительнее быстрее, чем к оперативной памяти.
    6) Если алгоритмы это позволяют, то возможно стоит реализовать их параллельное исполнение (в отдельных потоках или процессах). Это позволит эффективно задействовать современные многоядерные процессы.
    7) В некоторых случаях (например обработка изображений) большого эффекта можно достичь применением специализированных расширений процессора (SSE, SSE2, AXX, AVX2 и другие). Стоит отметить, что большинство современных компиляторов (GCC, MSVS, ICC) поддерживают непосредственное использование данных расширений непосредственно из С++ кода при помощи специальных встроенных функций (intrinsics). Минусами такого подхода является потеря переносимости (впрочем, эта проблема решается наличием разных веток программы под разные процессоры) и значительное усложнение программы.
    8) Также большого эффекта можно достичь применением специализированных ускорителей, например GPU (технологии CUDA, OpenCL). Минусами таких решений являются потеря универсальности и значительное усложнение программы, а также то, что на специализированных ускорителях, как правило, хорошо работает далеко не каждый алгоритм.
    Ответ написан
    Комментировать
  • Как удалять табуляцию?

    ErmIg
    @ErmIg
    Программист
    Для Visual Studio была такая волшебная комбинация клавиш: Control + K а потом Control+ F - авто выравнивание выделенного куска кода.
    Ответ написан
    1 комментарий
  • Где 128-битные процессоры?

    ErmIg
    @ErmIg
    Программист
    Тут важно, что вы понимаете под 128-bit процессорами?
    1) Если способность работать с 128-bit указателями, то наверное это в обозримом будущем не потребуется, так как пока вполне хватает 64-bit указателей, которые могут адресовать порядка 10^19 байт.
    2) Если способность работать с вещественными числами разрядностью в 128-bit, то такой процессор был в 70-е IBM_System/370, но затем от аппаратной поддержки таких чисел отказались за ненадобностью.
    3) Если способность работать с целыми числами разрядностью в 128-bit, то такой процессор тоже был в 80-е VAX (правда для работы с 128 разрядными числами там использовалось 4 32-bit регистра), но затем от аппаратной поддержки таких чисел тоже отказались.
    4) Если просто наличие 128-bit регистров, то такие процессоры давно есть (уже есть и 256-bit, а в ближайшее время ожидается и 512-bit), правда хранятся в них не одиночные числа, а вектора вещественных или целых числе меньшей разрядности.
    Ответ написан
    Комментировать
  • Как определить есть ли остаток от деления в c++?

    ErmIg
    @ErmIg
    Программист
    В C++ остаток от деления определяется оператором %. Например:
    int a = 5 % 3;
    Ответ написан
    Комментировать