2012-05-30 63 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所有可能的值在一個平面陣列,然後執行並行for循環在它解決:

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支持但它是如何完成編譯器的。