0

이것은 신경망에서 역 전파 알고리즘 코드의 일부입니다.동적 배열 병렬 처리

우리가 for (pt = 0; pt < N_PT_pair; pt ++) 루프를 병렬 처리하려면 for (epoch = 0; epoch < MaxEpoch, epoch ++)를 병렬 처리 할 수 ​​없습니다.

initialize W1[ ] [ ] and W2[ ][ ] with random values 
for(epoch=0; epoch<MaxEpoch; epoch++) 
    dW1[ ][ ]=0.0; dW2[ ][ ]=0.0; //sum of weight corrections 
    sse = 0; // Sum of square of errors 
    for(pt=0; pt<N_PT_pair; pt++) 
      input = pattern[pt]; 
      compute output // procedure as above 
      compare target[pt] and output and 
      compute dW2[ ][ ] += ... // procedure to be described 
      compute dW1[ ][ ] += ... // procedure to be described 
      for(k=1; k<=Noutput; k++) 
       sse+=pow((target[pt][k]-output[k]),2); 
    end pt for loop 
    cout << "mean square error" << sse/N_PT_pair; 
    W1[ ][ ] += rate*dW1[ ][ ] 
    W2[ ][ ] += rate*dW2[ ][ ] 
end epoch for loop 

이는 우리가 코드를 병렬화 할 수 있습니다 배열

double** allocate_matrix(int rows,int cols) 
{  
    double **a; 

    a = new double*[rows];  
    if(a==NULL){cout<<"matrix allocation failed"<<endl;exit(-1);} 

    for (int j=0;j<rows;j++){ 
     a[j] = new double[cols]; 
     if(a[j]==NULL) {cout<<"matrix allocation failed"<<endl;exit(-1);}  
    } 

    return a; 
} 

int deallocate_matrix(double**a,int rows)  
{ 
    for(int i=0;i<rows;i++) 
     delete [] a[i]; 
    delete [ ] a;  
    return 0; 
} 

를 할당하고 할당 해제에 대한 코드는? 내부 루프의 반복은 하나의 독립적 인 경우

+3

'new'는'NULL'을 반환하지 않습니다. 그것은'std :: bad_alloc'을 던집니다. 더 많은 importabtly, 어떤 병렬 처리 라이브러리를 사용하고 있습니까? – MSalters

답변

1

다른 당신은 단순히 하나 개의 OpenMP 구조와 함께 시작할 수 :

#pragma omp parallel for private(input,k) reduction(+:sse) 
for(pt=0; pt<N_PT_pair; pt++) 
    input = pattern[pt]; 
    compute output // procedure as above 
    compare target[pt] and output and 
    compute dW2[ ][ ] += ... // procedure to be described 
    compute dW1[ ][ ] += ... // procedure to be described 
    for(k=1; k<=Noutput; k++) 
     sse+=pow((target[pt][k]-output[k]),2); 
end pt for loop 

이 큰 일을 할 dW1 또는 dW2의 어떤 요소가 더 이상 업데이트되지 않은 경우 반복이 필요합니다. 그렇지 않으면 원자 적 액세스가 필요하며 이는 성능을 저하시킵니다 (OpenMP는 여전히 C/C++의 배열 감소를 지원하지 않습니다).

네트워크 가중치가 많은 경우 동일한 방식으로 곱셈을 병렬 처리 할 수도 있습니다.

OpenMP 오버 헤드를 줄이기 위해 병렬 영역을 외부 루프 외부로 더 이동할 수 있으며 single 또는 master OpenMP 지시문을 사용하여 단일 스레드에서만 실행해야하는 코드를 격리 할 수 ​​있습니다.

컴파일러가 #pragma omp 지시어를 이해하려면 OpenMP 지원을 활성화해야합니다. 특정 컴파일러는 정확히 어떻게이 작업이 완료입니다 :

GCC 오라클 솔라리스 스튜디오
  • 프로젝트 속성에 대한 인텔 C/C++ 컴파일러
  • -xopenmp에 대한
  • -openmp에 대한
    • -fopenmp - MS 비주얼에 대한> 등 Studio