병렬 프로 그래 밍 에서 데 이 터 를 분해 하 는 데이터 구조 및 수 동 할당 작업 방법

3085 단어
struct {  
        int start;  
        int end;  
    }value[] = {  
        {0 , NUMBER >> 1},  
        {NUMBER >> 1, NUMBER}  
    };  

이상 코드 는 데이터 분해 귀 약 을 실현 하 는 데이터 구조 입 니 다.예제 에서 이 구 조 는 데 이 터 를 두 단락 으로 나 누 어 각각 첫 번 째 꼬리 를 얻 고 함수 호출 에 편리 하 다.
/* 자신의 수 동 할당 작업 (구분 및 스케줄 링 정책 과 유사 한 static, 순환 할당) 
*  첫 번 째 는 모든 스 레 드 에서 분 배 된 블록 안의 임 무 는 연속 적 인 것 이다. id*(N/Nthrds)-->(id+1) * (N / Nthrds); 
*  두 번 째 스 레 드 마다 분 배 된 블록 에 있 는 작업 은 분 산 된 것 입 니 다. 두 번 째 id 개, 두 번 째 id + Nthrds 개, 두 번 째 id + 2 * Nthrds...... 에 이르다 
 
id+m*Nthrds>=N,。 
*  이 두 가지 사상의 차 이 는 참고 할 만하 다. 
*/  
      
// 방법 1  
        printf("/n------------------------ 수 동 할당 작업 방법 1 ------------------  
  
--------/n");  
#pragma omp parallel  
    {  
        int i, istart, iend;  
        int Nthrds = omp_get_num_threads(), id = omp_get_thread_num();  
        if (N/Nthrds == 0)  
        {  
            istart = id * (N / Nthrds);    
// 모든 스 레 드 는 N / nthrds 의 임 무 를 완성 합 니 다. N 개의 임 무 를 Nthrds 의 스 레 드 에 평균 적 으로 나 누 어 주 는 것 입 니 다. 마지막 스 레 드 가 부족 할 수 있 습 니 다.  
  
N / nthrds 개 미 션  
            iend = (id+1) * (N / Nthrds);  
        }  
        else{  
            istart = id * (N/Nthrds + 1);   
// 모든 스 레 드 가 N / nthrds 를 완성 합 니 다. + 1 개의 퀘 스 트, 마지막 스 레 드 가 N / nthrds 가 부족 할 수 있 습 니 다. + 한 가지 미 션.  
  
N / nthrds 개 를 완성 하고 마지막 스 레 드 는 남 은 것 을 완성 합 니 다.  
            iend = (id+1) * (N/Nthrds + 1);  
        }  
          
        for(i=istart; i
        {  
            c[i] = a[i] + b[i];  
            printf("threadnum=%d, c[%d]=%d/n", id, i, c[i]);  
        }  
    }  
    for (int i=0;i
    {     
        printf("c[%d]=%d/t", i, c[i]);  
        c[i] = 0;  
    }  
   
    printf("/n------------------------ 수 동 할당 퀘 스 트, 방법 2 -------------------------  
  
/n");  
// 방법 2  
#pragma omp parallel  
    {  
        int i, istart, iend;  
        int Nthrds = omp_get_num_threads(), id = omp_get_thread_num();  
        iend = N;  
        for(i=id; i
// 각 스 레 드 마다 id 개 퀘 스 트 를 한 번 에 완성 합 니 다. id + Nthrds 개, id + 2 * Nthrds... id + m * Nthrds > = N 까지 만 가능 합 니 다.  
        {  
            c[i] = a[i] + b[i];  
            printf("threadnum=%d, c[%d]=%d/n", id, i, c[i]);  
        }  
    }  
  
    for (int i=0;i
    {     
        printf("c[%d]=%d/t", i, c[i]);  
        c[i] = 0;  
    }  
  
    return 0;  
}  

좋은 웹페이지 즐겨찾기