2012-05-30 3 views
1

C 프로그램에서 병렬 실행을 구현할 가능성에 대한 질문이 있습니다. 내 코드는 다음과 같습니다C 프로그램에서 병렬 실행

struct str { 
    field; 
    field2; 
    struct name * ptrNext; 
} 

// something others 

int main() { 
    struct str *pHead = malloc((...)sizeof(struct str)); 
    struct str *ptr; 
    // other..... 
    /* Generation of dynamic list*/ 

    ptr=pHead; 

    while(... ... ...) { 
      someFunctionOnNode(ptr); 
      ptr=ptr->ptrNext; 
    } 
} 

프로그램의 속도를 높이기 위해 프로세서에 여러 개의 코어를 가진 악용, 나는 기능 someFunctionOnNode의 출시를 병렬화하고 싶습니다.

C에서이 작업을 수행 할 수있는 방법이 있습니까?

+3

pthread를 검색하십시오. – fbernardo

답변

0

표준 C에는 병렬 처리 기능이 없습니다. 최선의 선택은 플랫폼 종속적 인 멀티 스레딩 기능 또는 좀 더 이식 가능한 멀티 프로세싱 API를 사용하고 있습니다.

+3

[C11] (http://en.wikipedia.org/wiki/C11_%28C_standard_revision%29) 않습니다! (예, C11이 있다는 것을 알고 있습니까?) – Shahbaz

+0

그래, 알았어 :)하지만 주류 컴파일러/라이브러리의 c11은 적어도 제 지식에 있어서는 실험적으로 최선입니다. – cyco130

+1

나는 그것이 존재한다는 것을 배우는 것에 대해 열광했다. 나는 그 지식을 공유하고 싶었다. : D – Shahbaz

0

OpenMP은 클러스터 MPI를 사용하는 경우 프로세서가 메모리를 전환하는 경우 가장 좋은 해결책 일 수 있습니다. OpenMP에서 코드를 병렬로 실행하려는 컴파일러에 pragmas을 제공하기 만하면 기존 코드를 쉽게 적용 할 수 있습니다.

3

가장 간단한 방법은 거의 모든 최신 C 및 C++ 컴파일러에서 지원되는 OpenMP 지정 문을 사용하는 것입니다. 당신의 일이 충분히 현대 경우, 당신은 단순히 작업을 사용할 수 있습니다 (즉 OpenMP를 3.0 지원) :이 하나의 지시어는 그래서 하나의 스레드 만 목록을 걸어 작업을 생산할 예정이다

#pragma omp parallel 
{ 
    #pragma omp single 
    while(... ... ...) { 
     #pragma omp task 
     someFunctionOnNode(ptr); // This function call becomes a task 
     ptr=ptr->ptrNext; 
    } 
    #pragma omp taskwait 
} 

을하지만, 그 모든 스레드가를 선택합니다 실행할 태스크. taskwait 지시문은 모든 작업이 완료 될 때까지 대기합니다. parallel 영역의 끝 부분에 암시 적 장벽 동기화가 있기 때문에 반드시 필요한 것은 아닙니다.

당신의 컴파일러의 OpenMP 3.0을 지원하지 않는 경우, 당신은 그것을 통해 루프 평행 한 평면 배열에 ptr의 가능한 모든 값을 넣고 다음 수행하여 해결할 수 있습니다

datatype *ptrs[NUM_PTRS]; // Or allocate with new 
int i = 0; 
while (... ... ...) { 
    ptrs[i++] = ptr; 
    ptr = ptr->ptrNext; 
} 

#omp parallel for 
for (i = 0; i < NUM_PTRS; i++) 
{ 
    someFunctionOnNode(ptrs[i]); 
} 

또한 OpenMP의 지원을 활성화해야 컴파일러에 따라 다르다.