Я работаю над научным приложением, в котором есть легко разделяемые части, которые могут работать параллельно. Итак, я написал эти части для каждого запуска как независимые потоки, хотя и не для того, что кажется стандартной причиной разделения вещей на потоки (то есть, не блокируя какую-либо команду выхода или тому подобное).
Несколько вопросов:
Купит ли это мне что-нибудь на стандартных многоядерных десктопах - т. Е. Будут ли потоки работать на отдельных ядрах, если у меня установлена текущая JVM, или мне придется делать что-то еще?
У меня есть несколько объектов, которые читаются (хотя и не пишутся) всеми потоками. Потенциальные проблемы с этим? Решения этих проблем?
Для реальных кластеров, можете ли вы порекомендовать каркасам для распределения потоков по различным узлам, чтобы мне не приходилось управлять этим самостоятельно (ну, если таковые существуют)? ПОЯСНЕНИЕ: под этим я подразумеваю либо то, что автоматически преобразует потоки в задачу для отдельных узлов, либо делает весь кластер похожим на одну JVM (то есть, таким образом, он может отправлять потоки любым процессорам, к которым он может получить доступ), или чему угодно. По сути, реализуйте распараллеливание полезным способом в кластере, учитывая, что я встроил его в алгоритм, с минимальными затратами труда с моей стороны.
Бонус: Большая часть оценки состоит из сравнений наборов (например, объединение, пересечение, содержит) с некоторым отображением ключей, чтобы получить соответствующие наборы. У меня есть некоторый ограниченный опыт работы с FORTRAN, C и C ++ (семестр научных вычислений для первого и HS AP классы 10 лет назад для двух других) - какую скорость / простоту выигрыша в распараллеливании я мог бы найти, если бы связал свой Java-интерфейс к алгоритмическому бэк-энду на одном из этих языков, и какую головную боль может испытать мой уровень опыта при реализации этих операций на этих языках?