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

C多线程嵌套循环——超参数网格搜索的组合爆炸问题,c,multithreading,combinatorics,hyperparameters,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++)

我有一个不到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;
}
#包括
int数组_a[100000000];
//阵列大小为382 MB,1亿x 4字节
内部主(空)
{
对于(int a=0;a<1000;a++)
{
对于(int b=0;b<1000;b++)
{
对于(int c=0;c<1000;c++)
{
对于(int i=0;i<100000000;i++)
{
int x=数组a[i]+a+b+c;
}
}
}
}
返回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++)
编译1:for(int a=0;a<250;a++) 编译2:for(inta=250;a<500;a++) 编译3:for(inta=500;a<750;a++) 编译4:for(inta=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++)
线程1:(inta=0;a<40;a++) 线程2:(inta=40;a<80;a++) .... 线程24:(inta=920;a<960;a++) 线程25:(inta=960;a<1000;a++) 每个线程是否将为阵列使用400 MB的内存(总共使用10 GB ram)?或者每个线程将使用相同的400MB内存(总共400MB内存使用)?我不关心ram的使用,只关心最快的解决方案。

有一个为并行化提供API的解决方案

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

您必须对代码进行基准测试,看看有多少线程是理想的,因为线程创建附带了开销代码。

其中有一个提供了用于并行化的API

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


您必须对代码进行基准测试,看看有多少线程是理想的,因为线程创建附带了开销代码。

忘记pthreads,转而研究pthreads如何。你不是在做线程,只是并行计算。另外。。。您有4个CPU,因此25个线程是一个过度消耗,只要循环限制可以被线程数平均划分,那么就很容易计算范围,使用这些范围的结构(即开始索引和要进行的迭代次数),并且该结构还包含指向数组第一个元素的指针。然后将该结构传递给线程。至于内存使用情况,POSIX系统上的进程复制父进程的内存(即使它通常使用写时拷贝以提高效率),而在多线程进程中,所有线程共享相同的内存。不如忘记pthreads,转而研究它。你不是在做线程,只是并行计算。另外。。。您有4个CPU,因此25个线程是一个过度消耗,只要循环限制可以被线程数平均划分,那么就很容易计算范围,使用这些范围的结构(即开始索引和要进行的迭代次数),并且该结构还包含指向数组第一个元素的指针。然后将该结构传递给线程。至于内存使用,POSIX系统上的进程复制父进程的内存(即使它通常使用写时拷贝以提高效率),而在多线程进程中,所有线程共享相同的内存。