0

spark mllib multi-layer-perceptron 모델을 사용하여 벡터를 예측할 때 동일한 벡터가 때때로 멀티 스레딩에서 다른 결과를 제공한다는 사실을 발견했습니다. 소스 코드를 읽고 BLAS 라이브러리를 기반으로합니다. 멀티 스레딩에서 BLAS 용 테스트 코드를 만들었습니다.BLAS.dgemm 메서드 다중 스레드 계산 오류

BLAS dgemm utils를 사용하여 매트릭스를 계산하면 동일한 매트릭스 데이터가 멀티 스레딩을 사용할 때 다른 결과를 제공합니다.

내 테스트 코드는 github에서 찾을 수 있습니다. 테스트 코드에서 인공 테스트 데이터를 만듭니다. Windows 10을 사용하여 테스트하려면 Java 클래스 경로에 blas dll 파일을 추가하십시오. 반복적으로 실행할 때

blas.dgemm(transa, transb, m, n, k,alpha, a, _a_offset, lda, b, _b_offset, ldb,beta, c, _c_offset, ldc) 

결과는 동일합니다

나는 실행하는 하나의 스레드를 사용하는 경우. 그러나 5 개 이상의 스레드를 사용하여 동일한 데이터를 실행하면 blas.dgemm의 결과가 달라집니다. 이것은 혼동 스럽습니다. blas.dgemm의 동일한 데이터가 다른 결과를내는 이유는 무엇입니까?

Windows 10을 사용하는 경우 java 클래스 경로에 netlib-native_system-win-x86_64.dll을 추가하십시오.

+0

나는 꽤 큰 문법적 변화를 만들었고, 내가 잘못 생각한 것이 있다면 다시 바꾸거나 되돌려주십시오. 덕분에 – Shaido

+0

. 앞으로 문법 오류에주의를 기울일 것입니다. 덕분에 –

답변

0

만 DGEMM 내부 읽기 a와 b 배열 synchronously.if 모든 스레드에 의해 변경되는 동시성 문제는 C (힙에 동일한 개체를) .array있을 수 있습니다 function.then 그들의 필요없이 복제

@Override 
public void run() { 
     double[] aa=a.clone(); 
     double[] bb=b.clone(); 
     double[] cc=c.clone(); 
    try { 

     BLAS blas = BLAS.getInstance(); 
     blas.dgemm(transa, transb, m, n, k, 
       alpha, aa, _a_offset, lda, bb, _b_offset, ldb, 
       beta, cc, _c_offset, ldc); 

     System.out.println("c.rows:"+ m + " c.cols:"+n 
       + " c.data:"+ Arrays.toString(cc) 
       + " c._c_offset:"+_c_offset 
       + " c.ldc:"+ldc); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 


} 
+0

. 나는 문제를 해결했다. –