我有一个小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。
我需要在第一个for循环中更改两个数字,用于4个不同的编译:
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 ram使用)?或者每个线程是否将使用相同的400 MB RAM(总共400 MB RAM)?我不关心ram的使用,只是最快的解决方案。
有OpenMP,它提供了并行化的API。
如果你想用pthreads等手动完成它,你必须将循环放在线程回调中,然后将每个线程传递给a
min和max值,因为它是单独的工作顺序。只要没有线程覆盖另一个线程使用的内存区域,它们都可以同时访问阵列。
您必须对代码进行基准测试,并查看理想的线程数,因为线程创建带有开销代码。