gpt4 book ai didi

c - C程序中的并行执行

转载 作者:太空宇宙 更新时间:2023-11-04 02:13:19 25 4
gpt4 key购买 nike

我有一个关于在 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 中做到这一点?

最佳答案

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

关于c - C程序中的并行执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10818658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com