C多线程嵌套循环-来自超参数网格搜索的组合爆炸问题

时间:2019-03-13 11:30:06

标签: c multithreading combinatorics hyperparameters

我有一个小的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的使用,只是最快的解决方案。

1 个答案:

答案 0 :(得分:2)

OpenMP提供了用于并行化的API。

如果要使用pthreads等手动进行操作,则必须将循环放入线程回调中,然后将a的最小值和最大值作为每个作业的顺序传递给每个线程。只要没有线程覆盖另一个线程使用的内存区域,它们都可以同时访问该数组。

由于线程创建附带开销代码,因此您必须对代码进行基准测试,并查看有多少个理想线程。