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

标签 c multithreading combinatorics hyperparameters

我有一个不到 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/

相关文章:

c - 如何在物理内存中指定变量位置?

multithreading - 在处理网络连接时,有没有办法利用多核?

c# - Windows Forms .NET 中的 DataGridViewRow 线程安全

python - 来自模型的嵌套排列

c - 以编程方式获取给定的进程名称和 ppid

c - 从 execvp 将 stdout 写入文件

c++ - 如何用C/C++读取/恢复大数据文件(SEGY格式)?

c++ - Windows 10 特定崩溃调用 LeaveCriticalSection

c# - 计算巨大的排列 - 计算元素并获取第 n 个元素

javascript - 为什么我的次阶乘函数差了一个?