Многоядерное программирование: что нужно сделать?
У меня есть процессор quadcore, и я бы очень хотел воспользоваться всеми этими ядрами, когда я запускаю быстрые симуляции. Проблема в том, что я знаком с небольшим кластером Linux, который у нас есть в лаборатории, и я использую Vista дома.
Какие вещи я хочу изучить для многоядерного программирования с помощью C или Java? Что такое жаргон, который я хочу в Google?
Спасибо за помощь.
Ответы
Ответ 1
Ключевым словом является "threading" - не будет работать в кластере, но это будет просто отлично в одном многоядерном компьютере (фактически, на любом виде Windows, намного лучше вообще, чем размножение нескольких процессов - Windows "процессы довольно тяжелые по сравнению с Linux). Не так просто в C, очень просто в Java - например, запустите здесь!
Ответ 2
Вам нужны темы и актеры
Хорошая точка... вы не можете использовать ее для Google, если не знаете некоторые ключевые слова.
C: google pthread, сокращение от Posix Thread, хотя собственный интерфейс win32 не установлен, см. Создание потоков на MSDN.
Java: Смотрите класс Тема
Наконец, вы должны немного прочитать функциональное программирование, actor concurrency и неизменяемые объекты. Оказывается, управление concurrency в простой старой разделяемой памяти довольно сложно, но передача сообщений и функциональное программирование могут позволить вам использовать стили, которые по своей сути намного безопаснее и избегают проблем concurrency. Java действительно позволяет вам делать все, что сложно, когда данные являются изменяемой общей памятью, и вы отчаянно пытаетесь вручную блокировать общие государственные структуры. Но вы также можете использовать продвинутый стиль из java. Возможно, начните с этой статьи JavaWorld: Актеры на JVM.
Ответ 3
Посмотрите эту книгу: Java Concurrency на практике
Ответ 4
Это зависит от того, какой ваш предпочтительный язык должен выполнить.
Помимо решений для потоковой обработки, вы также можете рассмотреть
MPI как возможность от Java и C ---, а также от Python или R или все, что вам нравится.
DeinoMPI, по-видимому, популярен в Windows и OpenMPI только что началось с поддержки Windows в текущей версии 1.3.3.
Ответ 5
Думаю, вам стоит подумать и о Clojure. Он работает на JVM и имеет хорошую совместимость с Java. Как Lisp, он отличается от того, с чем вы привыкли с C и Java, так что это может быть не ваша чашка чая, но в любом случае стоит взглянуть на вопросы, адресованные Clojure, поскольку концепции независимо от того, какой язык вы используете. Посмотрите видео, а затем, если вы так склонны, Clojure сайт, который имеет ссылки на некоторые другие хорошие скринкасты более конкретно о Clojure в верхнем правом углу.
Ответ 6
Многие люди говорили о потоковом, что является одним из подходов, но рассмотрим другой способ сделать это. Что делать, если у вас было запущено несколько JVM, подключенных к сети и ожидающих, что работа придет? Как бы вы запрограммировали приложение, чтобы он мог использовать все эти JVM, не зная, находятся ли они на одном CPU?
На четырехъядерном компьютере вы должны иметь возможность запускать 12 или более JVM для обработки работы. И если вы подходите к проблеме под этим углом, масштабирование до нескольких компьютеров довольно простое, хотя вам необходимо учитывать более высокие сетевые задержки, когда ваша связь находится в реальной сети.
Ответ 7
Здесь является хорошим источником информации о потоковой передаче в С#.
Ответ 8
Вам нужно создать многопоточные программы. Java поддерживает многопоточность из коробки (хотя более старые JVM запускали все потоки на одном ядре). Для C вам нужно будет использовать специальный код платформы для создания и управления потоками (pthread * для Linux, CreateThread и компании для Windows). В качестве альтернативы вам может понадобиться выполнить потоковую передачу из С++, где имеется довольно много библиотек (например, Boost:: threads), чтобы сделать жизнь немного проще и разрешить переносимый код.
Если вам нужен код, который будет переносимым на одной машине с несколькими ядрами и кластером, вы можете посмотреть в MPI. Он действительно предназначен для кластерной ситуации, но был перенесен на работу на одной машине с несколькими процессорами или несколькими ядрами - хотя это не так эффективно, как код, написанный специально для одной машины.
Ответ 9
Итак, это очень широкий вопрос. Вы можете экспериментировать с многопоточным программированием, используя множество различных языков программирования, включая C или Java. Если бы вы хотели, чтобы я выбрал один для вас, я бы выбрал C.:)
Вы хотите посмотреть в потоки Windows, потоки POSIX (или многопоточность на Java, если этот язык). Вы можете попытаться найти некоторые проблемы для экспериментов. Я бы предложил попробовать матричное умножение; начните с последовательной версии, а затем попытайтесь улучшить время с помощью потоков.
Кроме того, OpenMP доступен для Windows и предлагает совершенно иное представление о том, как многопоточно программировать.
Ответ 10
Даже если вы задали вопрос только для C или Java, Erlang - не плохой выбор языка, если это всего лишь учебное упражнение.
Это позволяет очень легко программировать многопроцессорное программирование, и у него есть большой набор библиотек, которые позволяют вам погрузиться на любом уровне, который вам нравится.
Он был создан для распределенного программирования очень прагматичным способом. Если вам нравится java, переход не должен быть слишком сложным.
Если вы заинтересованы, я бы рекомендовал книгу "Программирование Erlang" Джо Армстронга.
(в качестве примечания: существуют другие языки, предназначенные для работы в сильно параллельных средах, таких как Haskell. Erlang просто имеет тенденцию быть более прагматичным, чем такие языки, как Haskell, которые больше коренится в теории)
Ответ 11
Если вы хотите сделать легкую потоковую обработку, например, параллельные петли, я рекомендую проверить .NET 4.0 Beta (С# в VS2010 Beta).
В главе книги Joe, связанной с ней, очень хорошо, что я использую сам и очень рекомендую, но не покрывает новые параллельные расширения для платформы .NET.
Ответ 12
да, много потоков, но если потоки обращаются к одной и той же позиции в памяти, будет выполняться только один поток,
нам нужны много ядер памяти
Ответ 13
Самым простым способом сделать многоядерное программирование в Windows является использование .NET 4 и С# или F #. Здесь - простой пример, когда параллельная программа (из перестрелки) на 7 × короче в F #, чем Java, и так же быстро.
.NET 4 предоставляет много новой инфраструктуры для параллельного программирования, и она очень проста в использовании.
Ответ 14
То, что вы говорите "используйте", звучит для меня как нечто большее, чем просто многопоточность. Моделирование в моей книге является интенсивным с точки зрения вычислений, и в этом отношении наиболее эффективным языком является C. Некоторые говорят об объединении, но очень мало программистов на сборке x86, которые могут побить современный компилятор C.
Для движка Windows NT (NT4, 2000, XP, Vista и 7) механизмы, которые вы должны изучить, - это потоки, критические разделы и порты завершения ввода-вывода (iocp). Нитки хороши, но вы должны иметь возможность синхронизировать их между собой и с I/O, в который входят cs и iocps. Чтобы убедиться, что вы отжимаете каждый последний бит производительности из своего кода, вам нужно профилировать, анализировать, экспериментировать/ре-конструкт. Очень весело, но очень много времени.
Ответ 15
Несколько потоков могут существовать в одном процессе. Нити, принадлежащие одному и тому же процессу, имеют одну и ту же область памяти (могут считывать и записывать одни и те же переменные и могут мешать друг другу). Напротив, разные процессы живут в разных областях памяти, и каждый из них имеет свои собственные переменные. Для связи процессы должны использовать другие каналы (файлы, трубы или сокеты).
Если вы хотите распараллелить вычисление, вам, вероятно, понадобится многопоточность, потому что вы, вероятно, хотите, чтобы потоки взаимодействовали в одной и той же памяти.
Говоря об эффективности, потоки быстрее создают и управляют, чем процессы (потому что ОС не нужно выделять целую новую область виртуальной памяти), а межпоточная связь обычно быстрее, чем межпроцессная связь. Но потоки сложнее программировать. Потоки могут мешать друг другу и могут записывать друг другу память, но способ, который это происходит, не всегда очевиден (из-за нескольких факторов, в основном переупорядочения команд и кэширования памяти), поэтому вам понадобятся примитивы синхронизации для контроля доступа к вашим переменным.
Взято из этого ответа.