我有一个关于在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中执行此操作?
答案 0 :(得分: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
的所有可能值放在一个平面数组中然后执行并行循环来解决它:
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支持,但它是如何完成的是编译器特定的。
答案 1 :(得分:0)
在单独的线程中启动每个函数。线程API取决于您正在开发的系统,但如果它类似于UNIX,则检查pthreads:
答案 2 :(得分:0)
是的。查看MPI Framework。
答案 3 :(得分:0)
标准C没有任何并行处理功能。您最好的选择是使用平台相关的多线程函数或其他一些更便携的多处理API。
答案 4 :(得分:0)