2012-05-30 43 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支持但它是如何完成编译器的。