Java에서 물리 시뮬레이션을 실행하기 위해 Linux 클러스터를 만드는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/333626

문제

저는 물리적 시뮬레이션을 수행하는 데 사용되는 과학적 애플리케이션을 개발 중입니다.사용된 알고리즘은 O(n3)이므로 대규모 데이터 세트의 경우 처리하는 데 매우 오랜 시간이 걸립니다.애플리케이션은 약 17분 만에 시뮬레이션을 실행하는데, 저는 약 25,000번의 시뮬레이션을 실행해야 합니다.처리 시간은 약 1년 정도입니다.

좋은 소식은 시뮬레이션이 서로 완전히 독립적이기 때문에 프로그램을 쉽게 변경하여 여러 컴퓨터에 작업을 배포할 수 있다는 것입니다.

이를 구현하기 위해 볼 수 있는 여러 가지 솔루션이 있습니다.

  • 멀티 코어 컴퓨터를 구입하여 모든 코어에 작업을 분배하십시오.내가 해야 할 일에는 충분하지 않습니다.
  • 여러 "처리" 서버에 연결하고 이들 서버 간에 로드를 분산하는 애플리케이션을 작성합니다.
  • 저렴한 Linux 컴퓨터 클러스터를 구입하고 프로그램이 모든 것을 단일 개체로 처리하도록 하십시오.

옵션 번호 2는 상대적으로 구현하기가 쉽기 때문에 이를 구현하는 방법에 대한 제안을 별로 찾지 않습니다. (주어진 포트에서 매개 변수를 기다리고 값을 처리하고 결과를 반환하는 프로그램을 작성하면 됩니다. 직렬화된 파일로).좋은 예가 될 것입니다 그리드 컴퓨팅.

그러나 마지막 옵션인 전통적인 클러스터의 가능성이 궁금합니다.Linux 그리드에서 Java 프로그램을 실행하는 것이 얼마나 어렵습니까?모든 개별 컴퓨터가 다중 코어가 있는 단일 컴퓨터로 처리되어 프로그램을 쉽게 적용할 수 있습니까?시작하는 데 도움이 되는 리소스에 대한 좋은 지침이 있습니까?아니면 이 문제를 너무 복잡하게 만들고 있어서 옵션 2를 사용하는 것이 더 나을까요?

편집하다:추가 정보로 Wired Magazine의 이 기사에 설명된 것과 같은 것을 구현하는 방법에 관심이 있습니다. Scientific은 슈퍼컴퓨터를 Playstation 3 Linux 클러스터로 교체했습니다..확실히 2번이 좋은 것 같군요...그러나 차가움 요소.

편집 2:계산은 매우 CPU 중심적입니다.기본적으로 큰 행렬에는 역행렬, 곱셈 등 많은 연산이 있습니다.나는 이러한 작업에 대해 더 나은 알고리즘을 찾으려고 노력했지만 지금까지 필요한 작업은 0(n3)(일반적으로 사용 가능한 라이브러리에서)이라는 것을 발견했습니다.데이터 세트는 (이러한 작업의 경우) 크지만 입력 매개변수를 기반으로 클라이언트에서 생성됩니다.


이제 Linux에서 컴퓨터 클러스터가 작동하는 방식에 대해 오해가 있었음을 알 수 있습니다.나는 마치 다중 코어가 있는 컴퓨터가 있는 것처럼 사용 가능한 모든 컴퓨터에 모든 프로세서가 있는 것처럼 보이는 방식으로 작동할 것이라고 가정했지만 실제로는 그렇지 않은 것 같습니다.이러한 모든 슈퍼컴퓨터는 일부 중앙 엔터티에 의해 배포된 작업을 실행하는 노드를 가짐으로써 작동하는 것으로 보이며 이러한 배포를 쉽게 수행할 수 있는 여러 가지 라이브러리와 소프트웨어 패키지가 있는 것으로 보입니다.

따라서 질문은 숫자 3과 같은 것이 없기 때문에 실제로 다음과 같습니다.클러스터형 Java 애플리케이션을 만드는 가장 좋은 방법은 무엇입니까?

도움이 되었습니까?

해결책

특히 계산이 이미 독립적이기 때문에 Java 병렬 처리 프레임 워크를 강력히 추천합니다. 나는이 학부생들과 약간의 일을했으며 매우 잘 작동합니다. 구현 작업은 이미 당신을 위해 이루어 졌으므로 이것이 "번호 2"의 목표를 달성하는 좋은 방법이라고 생각합니다.

http://www.jppf.org/

다른 팁

3번은 어렵지 않습니다.이를 위해서는 클라이언트와 감독자라는 두 가지 별도의 애플리케이션을 개발해야 합니다.클라이언트는 이미 가지고 있는 시뮬레이션을 실행하는 애플리케이션입니다.그러나 TCP/IP 등을 사용하여 감독자에 연결하고 일련의 시뮬레이션 매개변수를 요청하도록 변경이 필요합니다.그런 다음 시뮬레이션을 실행하고 결과를 감독자에게 다시 보냅니다.감독자는 클라이언트의 요청과 각 요청에 대해 데이터베이스에서 할당되지 않은 시뮬레이션을 가져오고 데이터베이스를 업데이트하여 항목이 할당되었지만 완료되지 않았음을 나타냅니다.시뮬레이션이 완료되면 감독자는 결과로 데이터베이스를 업데이트합니다.감독자가 실제 데이터베이스(MySql 등)에 데이터를 저장하는 경우 데이터베이스에서 시뮬레이션의 현재 상태를 쉽게 쿼리할 수 있습니다.이는 모든 클라이언트에게 시뮬레이션 데이터를 제공하는 데 걸리는 시간이 시뮬레이션을 수행하는 데 필요한 시간과 동일해지는 지점까지 확장되어야 합니다.

Linux 클러스터에 컴퓨팅을 배포하는 가장 간단한 방법은 MPI를 사용하는 것입니다. MPICH2를 다운로드하고 살펴 보는 것이 좋습니다. 무료입니다. 그들의 홈페이지가 여기 있습니다

시뮬레이션이 완전히 독립적 인 경우 MPI의 대부분의 기능이 필요하지 않습니다. MPI와 인터페이스하고 스크립트 또는 Java 프로그램의 실행을 시작하려면 몇 줄의 C 라인을 작성해야 할 수도 있습니다.

체크 아웃해야합니다 헤이즐 캐스트, Java에 대한 가장 간단한 Peer2Peer (중앙 집중식 서버 없음) 클러스터링 솔루션. 클러스터에서 코드를 실행하기 위해 Hazelcast 분산 ExecutorService를 사용해보십시오.

문안 인사,

-탈립

당신은 이미 그것을 제안했지만 실격을 실격시켰다 : 멀티 코어. 코어가 충분하다면 멀티 코어로 갈 수 있습니다. 핫 주제 ATM 중 하나는 GPGPU 컴퓨팅입니다. ESP. NVIDIAS CUDA는 동일한 계산을 수행 해야하는 독립적 인 작업이 많으면 매우 유사한 접근 방식입니다. GTX 280은 280 코어를 제공하여 최대 1120-15360 스레드를 동시에 계산할 수 있습니다. 그들 중 한 쌍이 당신의 문제를 해결할 수 있습니다. 실제로 구현 가능한 경우 모든 스칼라 프로세서가 SIMD 방식으로 작동하기 때문에 알고리즘 (데이터 흐름 대 제어 흐름)에 따라 다릅니다.

단점 : Java가 아닌 C/C ++입니다.

알고리즘은 얼마나 최적화됩니까? 기본 BLAS 라이브러리를 사용하고 있습니까? 순진한 라이브러리에서 최적화 된 라이브러리로 전환하여 약도 정도의 성능 게인을 얻을 수 있습니다. Atlas와 같은 일부는 또한 시스템의 여러 CPU에 대해 계산을 자동으로 퍼뜨려 탄소 1을 자동으로 커버합니다.

Afaik 클러스터는 일반적으로 단일 엔티티로 취급되지 않습니다. 이들은 일반적으로 별도의 노드로 취급되며 MPI 및 Scalapack과 같은 물건으로 프로그래밍되어 행렬의 요소를 여러 노드에 배포합니다. 데이터 세트가 어쨌든 하나의 노드에서 메모리에 맞는 경우에 많은 도움이되지 않습니다.

당신은 보셨습니까? 테라코타?

작업 배포를 위해 마스터/작업자 프레임 워크.

10 년 전, 제가 근무한 회사는 유사한 가상화 솔루션을 찾았으며 Sun, Digital 및 HP는 당시에는이를 지원했지만 하드웨어 핫 웨이 스와 같은 최첨단 슈퍼 컴퓨터 만 사용했습니다. 그 이후로 Linux가 Solution #3을 위해 찾고있는 가상화 유형을 지원한다고 들었지만 직접 사용한 적이 없습니다.

자바 프리미티브 및 성능

그러나 매트릭스 계산을 수행하면 Java가 아닌 기본 코드로 수행하고 싶습니다 (Java Primitives를 사용하고 있다고 가정). 특히 캐시 미스는 비용이 많이 들며 배열에서 인터리빙하면 성능이 사라집니다. 매트릭스와 기본 코드에있는 무관심한 메모리 덩어리는 추가 하드웨어없이 대부분의 속도를 얻을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top