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

问题描述 投票:0回答:1

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

c multithreading combinatorics hyperparameters
1个回答
2
投票

OpenMP,它提供了并行化的API。

如果你想用pthreads等手动完成它,你必须将循环放在线程回调中,然后将每个线程传递给a min和max值,因为它是单独的工作顺序。只要没有线程覆盖另一个线程使用的内存区域,它们都可以同时访问阵列。

您必须对代码进行基准测试,并查看理想的线程数,因为线程创建带有开销代码。

© www.soinside.com 2019 - 2024. All rights reserved.