我有一个不到 500 行代码的小型 C 程序。这是一个简化版本。实际的计算密集度更高。
#include<stdio.h>
int array_a [100000000];
// array 382 MB in size, 100 million x 4 bytes
int main(void)
{
for (int a = 0; a < 1000; a++)
{
for (int b = 0; b < 1000; b++)
{
for (int c = 0; c < 1000; c++)
{
for (int i = 0; i < 100000000; i++)
{
int x = array_a[i] + a + b + c;
}
}
}
}
return 0;
}
现在我为我的 4 核 cpu 进行手动多线程处理,在那里我编译了 4 个不同版本的代码。使用上面的示例,每个进程将使用 400 MB 的内存,总共使用 1.6 GB 的内存。
对于 4 种不同的编译,我只需要在第一个 for 循环中更改两个数字:
compile 1: for (int a = 0; a < 250; a++)
compile 2: for (int a = 250; a < 500; a++)
compile 3: for (int a = 500; a < 750; a++)
compile 4: for (int a = 750; a < 1000; a++)
非常简单的解决方案。
我一直在尝试找出 pthreads,但我无法全神贯注。我的代码不使用函数和指针。
如何将上面的代码拆分为 25 个线程?
thread 1: (int a = 0; a < 40; a++)
thread 2: (int a = 40; a < 80; a++)
....
thread 24: (int a = 920; a < 960; a++)
thread 25: (int a = 960; a < 1000; a++)
每个线程是否要为阵列使用 400 MB(总共 10 GB 内存使用量)?还是每个线程都将使用相同的 400 MB 内存(总共 400 MB 内存使用量)?我不关心 ram 的使用,只关心最快的解决方案。
最佳答案
有 OpenMP它提供了一个用于并行化的 API。
如果您想使用 pthreads 等手动执行此操作,则必须将循环放入线程回调中,然后将 a
最小值和最大值作为其单独的作业顺序传递给每个线程。只要没有线程覆盖另一个线程使用的内存区域,它们就可以同时访问数组。
您必须对代码进行基准测试,看看有多少线程是理想的,因为线程创建伴随着开销代码。
关于C多线程嵌套for循环-超参数网格搜索的组合爆炸问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55140872/