我有一个小的C程序,代码少于500行。这是一个简化的版本。实际的是更多的计算密集型。
#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的ram,总共使用1.6 GB的ram。
对于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++)
非常容易的解决方案。
我一直在尝试找出pthread,但是我无法解决它。我的代码不使用函数和指针。
您如何将上面的代码分成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的RAM使用量)?还是每个线程都将使用相同的400 MB内存(总计400 MB内存使用量)?我不关心ram的使用,只是最快的解决方案。
答案 0 :(得分:2)
有OpenMP提供了用于并行化的API。
如果要使用pthreads等手动进行操作,则必须将循环放入线程回调中,然后将a
的最小值和最大值作为每个作业的顺序传递给每个线程。只要没有线程覆盖另一个线程使用的内存区域,它们都可以同时访问该数组。
由于线程创建附带开销代码,因此您必须对代码进行基准测试,并查看有多少个理想线程。