3

我有一个关于在 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;
    }
}

为了提高程序的速度并利用处理器中的多个内核,我想并行启动 function someFunctionOnNode

有没有办法在C中做到这一点?

4

5 回答 5

5

最简单的方法是使用几乎所有现代 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 支持,但它的完成方式是特定于编译器的。

于 2012-05-30T15:01:34.320 回答
0

在单独的线程中启动每个函数。线程 API 取决于您正在开发的系统,但如果它类似于 UNIX,请查看 pthreads:

https://computing.llnl.gov/tutorials/pthreads/

于 2012-05-30T14:47:51.423 回答
0

就在这里。查看MPI 框架

于 2012-05-30T14:48:39.123 回答
0

标准 C 没有任何并行处理功能。您最好的选择是使用平台相关的多线程函数或其他一些更便携的多处理 API。

于 2012-05-30T14:49:28.450 回答
0

如果处理器剪切内存,如果您有集群 MPI,OpenMP可能是最好的解决方案。在 OpenMP 中,您只需向希望代码并行运行的编译器提供编译指示,因此很容易调整现有代码。

于 2012-05-30T15:01:18.450 回答