2013-08-09 2 views
0

두 개의 행렬 즉 A (1500 행렬)와 B (150000 행렬)가 있습니다.큰 데이터를위한 Java의 병렬 컴퓨팅

집합 A의 각 행렬 a에 대해 a와 b의 B 검사 기준에서 모든 요소 b를 반복합니다 (일부 행렬 b의 경우 참이면 iterating을 중지하고 참을 반환합니다.) 그러나 반복 이후 일치 항목이없는 경우 Set B 전체를 false로 리턴).

제 질문은 Java를 사용하여이 프로그램을 병렬로 만드는 방법입니까?

매트릭스 세트가 상당히 크다는 것을 알고 있습니다. (위에 게시 한 요소의 개수는 실제 사례의 경우 더 많을 것입니다.) 계산을 정확히하는 방법? 1 5000 개의 스레드를 생성하고 실제로 모든 계산을 수행하는 것은 좋은 생각이 아닙니다. 모든 계산 작업을 수행하는 최적의 스레드 양은 얼마입니까?

+0

Executors.newFixedThreadPool (numberOfThreads)을 작성하십시오. 여기서 스레드 수는 JVM이 사용할 수있는 코어의 수에 의해 제한됩니다. –

+0

여기에 잘못된 문제를 해결하려는 것 같습니다. 진정한 질문은 "이 검사를 빨리하기 위해 최대한 많은 CPU를 사용할 수 있습니까?"... "어떻게 이런 검사를하지 않을 수 있습니까?" 예를 들어, 행렬을 세트 또는 맵에 저장하거나 가능한 경우 확인해야하는 기준으로 색인 된 행렬을 저장합니다. – cHao

+0

@cHao 검사를 피할 수 있다고 생각하지 마십시오. –

답변

1

당신이 말했듯이 모든 쌍을 검사해야 할 수도 있고 검사 순서가 도움이 될 수 있으므로 검사에 CPU가 낭비되는 I/O 또는 sth가 필요없는 경우 4 가지 예의 경우 4 코어의 경우 4 스레드 (0-3)를 만들고 스레드 i는 a(4k+i) 및 모든 b을 확인해야합니다. 각 스레드에서 확인 각하기 전에, 당신은 당신이 진정한 쌍 여부, 모든 스레드가 작동 중지 될 때까지 기다릴 필요가 Thread

public class Worker extends Thread{ 
    static int found=0; 
    /** 
    * @param args the command line arguments 
    */ 
    List<Matrix> a; 
    List<Matrix> b; 
    int myid; 
    int coreNumber; 
    Worker(List<Matrix> a, List<Matrix> b, int myid,int coreNumber){ 
     this.a=a; 
     this.b=b; 
     this.myid=myid; 
     this.coreNumber=coreNumber; 

    } 

    @Override 
    public void run() { 
     for(int i=myid;i<a.size();i+=coreNumber){ 
      for(int j=0;j<b.size();j++){ 
       if(found==1){ 
        return; 
       } 
       if(check(a.get(i),b.get(j))){ 
        found=1; 
        return; 
       } 
      } 
     } 
    } 

} 

를 확장 클래스에서 정적 변수에 의해 수행 그 캔을 찾을 수 있는지 여부를 확인해야합니다.

1

ForkJoinPool을 찾고 계신 것 같습니까?

나는 당신의 상황에 적합한 예를 정리하려고 노력할 것이다. 본질적으로 프로세스를 여러 부분으로 나눠야합니다. 아마도 각 경우 a에 대해 하나의 포크를 사용하고 해당 포크에있는 b을 모두 실행해야합니다. 풀은 자동으로 프로세서를 최대한 활용합니다.

매우 간단한 예가 here입니다.

관련 문제