2011-12-24 50 views
7

Tôi có một vòng lặp for trong mã C của tôi như sau:parallelizing một vòng lặp for trong C

for(i=0; i<100000; i++){ 

    a[i] = simulate(); // simulate() function simulates some system 

} 

Chúng ta thấy rằng tính toán của mỗi lần lặp là độc lập với người khác (theo thứ tự của các yếu tố trong a[] là không quan trọng đối với tôi). Tôi muốn song song việc tính toán này cho vòng lặp bằng cách sử dụng đa luồng. Tôi không chính xác nhận thức được làm thế nào để làm điều này trong C? Tôi có một máy xử lý 8, vì vậy tôi có thể chạy 8 chủ đề song song.

Trả lời

11

Không có cách di động nào để thực hiện song song trong C *. Tuy nhiên, OpenMP standard được hỗ trợ rộng rãi:

#pragma omp parallel for 
for(i=0; i<100000; i++){ 

    a[i] = simulate(); // simulate() function simulates some system 

} 

Tùy thuộc vào trình biên dịch của bạn, sẽ có một lá cờ mà bạn phải thiết lập để cho phép hỗ trợ OpenMP:

  • MSVC:/openmp
  • GCC :-fopenmp

cũng như một tiêu đề nếu bạn muốn truy cập vào các chức năng OpenMP chắc chắn:

#include <omp.h> 

EDIT:

* Các (rất gần đây đã được phê duyệt) tiêu chuẩn C11 đã hỗ trợ cho chủ đề qua <threads.h>.

+1

'Không có cách nào để di chuyển song song trong C' Chuẩn C11 mới chỉ cũ vài ngày, nhưng điều này đang thay đổi! – u0b34a0f6ae

+0

@ kaizer.se Woah, tôi không nhận ra C11 đã được chấp thuận! Tôi sẽ đề cập rằng trong câu trả lời của tôi. Cảm ơn! – Mysticial

+0

Cảm ơn bạn đã trả lời. Tôi đã thử điều này. Đối với một số [i] tôi nhận được một "nan" hoặc "-nan" mặc dù mã hoạt động đúng khi thực thi serially. Tôi nghĩ rằng có thể có một số loại vấn đề đồng bộ hóa –

0

Nếu trình biên dịch của bạn hỗ trợ chuẩn C11, cụ thể là stdatomic.h thì bạn có thể thực hiện việc này.

Dưới đây là một ví dụ thô nên cung cấp cho bạn ý tưởng cơ bản đằng sau nó. Nó không phải là rất khó. Điều này sử dụng chủ đề posix nhưng bạn sẽ có thể sử dụng bất kỳ thư viện luồng.

#include <stdio.h> 
#include <stdatomic.h> 
#include <pthread.h> 

#define ELEMENTS_N 500000 

_Atomic unsigned int x; 
unsigned int N; 
unsigned int anyArray[ELEMENTS_N]; 

void * ThreadLoop (void * args) 
{ 
    unsigned int l; 
    while((l = atomic_load(&x)) < N) 
    { 
    if (atomic_compare_exchange_weak(&x, &l, l + 1)) 
    { 
     anyArray[l] = l; 
    } 
    } 
    return 0; 
} 


int main (int argc, char *argv[]) 
{ 

    pthread_t th1; 
    pthread_t th2; 
    int v; 

    atomic_store(&x, 0); 
    N = ELEMENTS_N; 

    v = pthread_create(&th1, NULL, &ThreadLoop, NULL); 
    v = pthread_create(&th2, NULL, &ThreadLoop, NULL); 

    pthread_join(th1, NULL); 
    pthread_join(th2, NULL); 

    for(v = 0; v < ELEMENTS_N; v++) 
    { 
    printf("%d ", anyArray[v]); 
    } 

    return 0; 
} 
Các vấn đề liên quan