Я где-то читал (забыл, что это за книга), что алгоритмы не зависят от компьютерной архитектуры. Некоторые даже говорят, что алгоритмы сами по себе являются вычислениями (машины?)?
С другой стороны, в книгах по параллельному программированию есть главы, посвященные параллельным алгоритмам. Кажется, параллельные алгоритмы зависят от параллельных архитектур?
Я думаю, что скучаю по большим фотографиям? Благодарю.
Ответы:
Алгоритмы - это последовательность шагов, предпринимаемых для решения конкретной проблемы. Рецепт для решения проблемы, если хотите. «Программы» делают то же самое, конечно; мы используем «алгоритм», чтобы предложить «обобщенные» или «общеприменимые» рецепты, которые не зависят от конкретных конструкций машин, языков программирования и тому подобного.
Алгоритмы должны быть общими, но они могут зависеть от наличия некоторых функций. Например, «параллельные алгоритмы» могут зависеть от того, что у вас есть некоторый механизм для одновременной работы разных программ. «Распределенные алгоритмы» могут зависеть от наличия у вас более одной системы в сотрудничающей группе, а также от сети или другой схемы связи между ними. Точно так же «параллельные алгоритмы» часто представляют собой те, которые предназначены для запуска, когда у вас есть несколько блоков обработки - потенциально много, много блоков обработки, и средства связи, которые распространены, когда у вас большие массивы блоков обработки. Возможно, вы сможете запустить «параллельный алгоритм», даже если у вас есть только один компьютер или один процессор - но это не очень интересно, если у вас нет инженеров по трафику.
источник
Алгоритмы не зависят от компьютерной архитектуры. Это потому, что алгоритмы определяют ряд процессов, которые решают проблему. Независимо от архитектуры, алгоритмы сортировки всегда будут сортироваться. Он не будет внезапно отображать трехмерные рисунки на некоторых архитектурах.
Если вы думаете об этом, это на самом деле интуитивно понятно. Google Chrome (просто набор алгоритмов) - это веб-браузер, скомпилированный для любой архитектуры. Он не стал бы внезапно драйвером устройства на некоторых архитектурах.
Но скорость работы алгоритмов зависит от архитектур. И некоторые алгоритмы работают быстрее, чем другие, в зависимости от архитектуры.
Если вы думаете об этом, это также на самом деле интуитивно понятно. Учитывая алгоритм, разработчик оборудования всегда может спроектировать архитектуру, которая специально ускоряет этот алгоритм. Это одна из причин, почему существуют такие вещи, как 3D-ускоренные видеокарты и ускорители майнинга биткойнов.
Когда люди говорят о параллельных алгоритмах, они говорят о семействе алгоритмов, которые могут работать быстрее на параллельных архитектурах. Существует множество алгоритмов, которые не улучшаются параллельными архитектурами. Поэтому выявление новых алгоритмов для той же проблемы, которые хорошо работают параллельно, является активной областью исследований.
Но эти алгоритмы все еще делают то же самое. Архитектура не меняет то, что они делают.
источник
На мой взгляд, ответ прост: нет. Вообще я получаю только свойства
думая об аппаратной архитектуре.
Ссылаясь на параллелизм, вы можете иметь любой параллельный алгоритм для пакетного вычисления и любую параллельную арку для последовательной работы, поэтому алгоритм не зависит от этого. Размер слова может быть проблемой для числовой стабильности, но не для самого алгоритма. Ограничения ресурсов, такие как 64-битные, могут описывать только 2 ^ 64 различных чисел, которые могут быть проблемой, но в любом случае элементы ограничены.
Конечно, могут быть некоторые алгоритмы, которые зависят от некоторых расширенных наборов команд, но, по крайней мере, все можно описать с помощью базовой математики.
Например, при квантовых вычислениях некоторые значения Big-O могут измениться, и тогда я бы сказал, что
больше не верно
источник
Алгоритмы не зависят от архитектуры компьютера, однако эффективность выполнения любого конкретного алгоритма зависит от архитектуры. Любые машины Turing Complete могут эмулировать любые другие машины Turing Complete, хотя некоторые машины были бы лучше в одном, чем другие.
Под параллельными алгоритмами мы подразумеваем, что алгоритм работает хорошо или может использовать преимущества параллелизма в машине, возможно, потому, что он требует меньшего количества блокировок, чем в противном случае потребовалось бы для алгоритмов, которые специально не предназначены для параллельной машины, или, возможно, потому что Алгоритм эффективно использует разделяй и властвуй, чтобы использовать всю мощь машины. Выполнение алгоритма на непараллельной машине все еще возможно, но может быть не столь эффективным, или для правильной работы может потребоваться дополнительная блокировка.
Существуют также алгоритмы, разработанные для того, чтобы воспользоваться преимуществами конкретной архитектуры, например алгоритмы, удобные для кэширования, которые оптимизируют кэширование. Эти алгоритмы могут быть менее эффективными на машинах, которые не кэшируют так, как предполагает алгоритм.
источник
Теоретически, алгоритмы полностью независимы от архитектуры. Вы всегда можете эмулировать параллельную архитектуру в системе с одним временным интервалом. Вы можете рассуждать об алгоритмах без архитектуры вообще. Книга Кнута использует вымышленную архитектуру.
На практике существуют алгоритмы, которые пытаются достичь лучшего времени выполнения при той же сложности «O» за счет оптимизации использования оборудования кеша и примитивов синхронизации.
источник
Да и нет. Это зависит от ограничений, которые вы хотите встретить, и предварительных условий, необходимых для запуска вашего алгоритма.
В идеале алгоритм - это абстрактный рецепт, который шаг за шагом определяет, как что-то делать. Алгоритмы были определены так же с целью воспроизводимости и последующей автоматизации. Алгоритмы происходят от лямбда-исчисления, поэтому вы можете легко понять, почему они сделаны таким образом. Это определение является обычным, но современные алгоритмы могут быть непоследовательными (не пошаговыми, как параллельные алгоритмы, или логическими, например, использующими объединение), нелинейными (стохастические алгоритмы) или просто странными (квантовыми алгоритмы), но я передам это.
Таким образом, в идеале алгоритм должен быть как можно более абстрактным, без учета какого-либо оборудования.
Но, как и в любой системе, вы должны определить некоторые аксиомы не только для того, чтобы получить согласованную систему, но и для того, чтобы выиграть время. Например, большинство алгоритмов предполагают, по крайней мере неявно, что они определены на машине фон Неймана. Если бы это было не так, им нужно было бы явно определить каждую часть системы, на которой они должны работать (поскольку это требуется для воспроизведения рецепта, это своего рода предварительное условие). Кроме того, часто алгоритмы опираются на общие команды, такие как write (), не определяя их полностью.
Еще одна причина, по которой алгоритмы не столь отвлечены от аппаратной архитектуры, - это когда вам необходимо выполнить некоторые ограничения .
Допустим, вы работаете со встроенными системами, и, возможно, вы не можете полагаться на то же количество ресурсов, которое есть на рабочих станциях. Вероятно, одним из наиболее сдержанных ресурсов является память. Однако большинство алгоритмов имеют тенденцию оптимизировать сложность времени (скорость выполнения на процессоре), а не сложность памяти (объем памяти, необходимый для работы с данными). Для этих систем были разработаны алгоритмы, оптимизированные для памяти, в которых алгоритмы, не оптимизированные для памяти, просто отказывали или работали намного медленнее. Фактически, встроенные системы не являются единственной целью алгоритмов, эффективно использующих память: например, существуют алгоритмы , не обращающие внимания на кэш, которые адаптируют их обработку для эффективного использования кэша ЦП. Другой пример: некоторые алгоритмы машинного обучения для больших данных адаптированы дляинкрементное обучение или неосновные вычисления для обработки огромного объема данных, намного превышающего объем памяти, доступный на любом компьютере, и т. д.
Существуют также алгоритмы, которые не оптимизируют определенную часть компьютера, но стандарт, который зависит от аппаратной архитектуры. Например, числовые данные, которые требуют точности, хранятся внутри числа с плавающей запятой или двойного числа, которые по своей природе ограничены из-за аппаратных ограничений. Проблема в том, что сложные вычисления могут привести к округлению, и чем больше вычислений вы выполняете для округленных чисел, тем больше вы будете смещаться. Это называется катастрофическим вмешательством . Некоторые приложения нуждаются в критической точности, даже за счет некоторой наихудшей сложности. Для этого типа приложений были разработаны алгоритмы, которые оптимизируют их вычисления для уменьшения или устранения катастрофических помех.
Таким образом, разработка алгоритма также может быть компромиссом между абстракцией и ограничениями.
В конце концов, мы можем сказать, что алгоритм такой же абстрактный, как и его цель, и его предварительные условия (архитектура) . Чем конкретнее цель, к которой стремится ваш алгоритм, тем больше он, вероятно, будет опираться на аппаратную архитектуру.
Некоторые похожие ключевые слова, которые могут вас заинтересовать:
источник
Не следует путать алгоритм в целом с математическими или вычислительными алгоритмами. Если вы имеете в виду вычислительные алгоритмы, да, они не зависят от архитектуры машины.
Определение алгоритма из Википедии:
Это определение используется для обозначения некоторых закрытых вычислений или задач обработки данных. Другими словами, вычисления, которые можно абстрактно запускать на машине Тьюринга . Тем не менее, в последнее время в математике существует концепция под названием « Интерактивные вычисления», которая предполагает взаимодействие ввода-вывода с внешним миром во время вычислений.
В общем определении алгоритм - это просто рецепт (последовательность инструкций). Я думаю, что вы не можете придумать алгоритм, не зная набора команд или операций, которые вы можете использовать; Математические операции - это вычисления, тогда алгоритм, который включает в себя этап с именем « разогреть духовку », не является математическим алгоритмом, но вы можете передать его шеф-повару, потому что он знает, как его выполнить.
Затем вы можете создать машину, которая может выполнять X, Y, Z .... каждый из них может использоваться в вашем алгоритме в качестве инструкции. Но если все они касаются закрытых вычислений (фактически, неинтерактивных детерминированных цифровых вычислений с малыми шагами), то можно доказать, что ваша машина эквивалентна машине Тьюринга . Но если вы нацелены на другие типы вычислений (продолжающиеся значения или интерактивные вычисления [однако я не уверен, действительно ли они представляют собой другой тип вычислений]) или даже не вычислительные задачи, вы можете подумать о машинах, которые могут их выполнять.
Этот вопрос и ответ также интересны, чтобы получить более широкое представление об алгоритмах.
источник
В общем, алгоритмы предназначены для некоторых конкретных задач при минимизации некоторой меры «стоимости». Исторически многие алгоритмы разрабатывались исходя из предположения, что относительные затраты на общие операции будут относительно одинаковыми на многих архитектурах, и, таким образом, некоторые типичные машины будут работать, один алгоритм будет работать лучше, чем другой, тогда на большинстве типичных машин прежний алгоритм будет работать при худшее, только немного уступать последнему. Со временем такое предположение не так хорошо, как раньше.
Например, раньше считалось, что количество раз, когда программа должна была читать что-то из памяти, считалось более важным, чем местоположение вещей, которые нужно прочитать. Чтение вещей, которые находились в памяти рядом друг с другом, было несколько дешевле, чем чтение вещей, которые были далеко друг от друга, но не показывали себя безобразно. Однако по мере того, как скорости основного процессора увеличивались со скоростью, значительно превышающей скорости памяти, важность последовательности доступа значительно возросла. Возможно, чтобы одна программа выполняла в десять раз больше инструкций, чем другая, и все же она выполнялась бы быстрее, если 95% выборок памяти предыдущей программы генерируют обращения к кэш-памяти L1, а большинство выборок памяти последней программы генерируют ошибки кеширования.
Кроме того, некоторые виды алгоритмов, связанных с параллелизмом, делают различные предположения о том, когда данные, записанные в память одним ядром процессора, будут «видны» другими ядрами. Многие процессоры имеют различные способы чтения и записи в память, с различными затратами и гарантиями видимости. Некоторые алгоритмы будут очень хорошо работать на архитектурах, которые могут удовлетворять требованиям видимости «бесплатно», но плохо на других, где инструкции, необходимые для этих гарантий, дороги. Действительно, на некоторых архитектурах определенные алгоритмы, связанные с параллелизмом, могут гарантированно работать только путем ограничения выполнения одним центральным процессором с общим временем (что, конечно, лишает смысла использование параллельного алгоритма).
источник
Во многих ответах отсутствует тот факт, что алгоритм может быть определен в терминах, которые являются либо абстрактными, либо в прямом, буквальном отношении к архитектуре. Алгоритм должен быть однозначным, но все еще есть место для того, чтобы он был более или менее конкретным.
Алгоритм преобразования строки в заглавные буквы может быть легко описан в псевдокоде, который не зависит от архитектуры. Но в то же время ничто не мешает вам описать алгоритм для преобразования строки в заглавные буквы специально для архитектуры x86. Все, что нужно, это домашнее задание по сборке x86. (Вы все еще можете сделать это в псевдокоде - просто в псевдокоде, относящемся к этой архитектуре!). Тот факт, что проблема связана именно с выполнением этой задачи на архитектуре x86, не означает, что у вас больше нет алгоритма для ее решения.
Это зависит от проблемы, для которой определен алгоритм. Алгоритм не зависит от архитектуры, если решаемая им проблема не зависит от архитектуры (и при условии, что это не отменено при описании или объединении алгоритма). Проблема может быть либо теоретической, классной, либо с точки зрения очень специфической архитектуры. В последнем случае алгоритм, в свою очередь, будет ограничен работой с этой архитектурой.
источник
Алгоритмы представляют собой последовательность шагов. Они не зависят от того, что их выполняет (или нет).
Однако временная сложность алгоритма может зависеть от того, что его выполняет. Вот почему для детального анализа алгоритма требуется «модель вычислений», такая как машина с произвольным доступом .
Независимо от того, является ли память доступной в произвольном порядке, определенно влияет на то, сколько времени занимает выполнение вашего алгоритма, и большинство алгоритмов предполагают, что это так, тогда как в действительности большинство архитектур не удовлетворяют этому условию.
источник
Они различаются в зависимости от контекста проблем. Алгоритм - это набор шагов для решения проблемы. Контекст этой проблемы может быть теоретически любым. Следовательно, алгоритм решения проблемы может зависеть буквально от всего, что мы можем себе представить. Позвольте мне уточнить на примере. Допустим, вам дано задание,
Теперь вы можете представить, что ваш алгоритм будет зависеть от архитектуры или нет? Конечно , да .
источник