用GCC编译一个C程序,这样它就可以在linux中使用所有的cpu核

用GCC编译一个C程序,这样它就可以在linux中使用所有的cpu核,c,linux,gcc,C,Linux,Gcc,我有一个示例C程序用于添加。当我用GCC编译和运行它时,它只使用一个CPU核 有没有办法编译一个C程序,这样它就可以在Linux中使用所有的CPU核 我以前编译时喜欢gcc-O3 malloc.c 代码: #包括 #包括 #包括 int main(){ 浮动*ptr; 未签名的长i; ptr=(浮动*)malloc(800000000*sizeof(浮动)); 对于(i=0;i 有没有办法编译一个C程序,这样它就可以在Linux中使用所有的CPU核 不,没有你想要的那么神奇。程序的运行是一个非常

我有一个示例C程序用于添加。当我用GCC编译和运行它时,它只使用一个CPU核

有没有办法编译一个C程序,这样它就可以在Linux中使用所有的CPU核

我以前编译时喜欢
gcc-O3 malloc.c

代码:

#包括
#包括
#包括
int main(){
浮动*ptr;
未签名的长i;
ptr=(浮动*)malloc(800000000*sizeof(浮动));
对于(i=0;i
有没有办法编译一个C程序,这样它就可以在Linux中使用所有的CPU核

,没有你想要的那么神奇。程序的运行是一个非常困难的课题,通常无法自动完成。顺便说一句,并行程序可能没有你希望的那么高效(请注意)

但是,您可以设计和编写并行程序。例如,您可以使用。注意,这是很棘手的!请先阅读一些。您不确定所有程序都会被使用(因为它们是由管理的),但在实践中很可能会被使用。另请阅读关于

您也可以使用或。您可以使用编写一些数字内核。您可以使用一种方法(例如,分叉多个,使用),或者使用。还可以查看该方法、库(以及许多其他方法)

您可以在操作系统上阅读一些内容,例如。您也可以阅读Linux系统编程方面的内容,例如(或一些较新的书籍)。另请参阅和&

请注意,设计、编码和调试一个(或并发,或)应用程序是非常困难的。考虑到开发时间的成本(以及获得相关技能可能需要的时间)。有


(将现有的实际顺序应用程序转换为并行应用程序不是很现实;您通常必须从头开始设计并行程序)

您需要创建多个线程。否则,只有一个线程,并且它(一次)运行在单个核上


查看有关线程的教程,特别是pthreads,了解如何使用线程。或者您可以使用fork系统调用将程序拆分为多个进程,每个进程有一个线程。

尝试在
循环的
上方添加以下pragma:

#pragma omp parallel for
for(i=0; i<8000000000; i++) {
    ptr[i] = i/10000;
}
#pragma omp parallel for

对于(i=0;i您可以创建
n
(n是假定的核心数)程序中的线程,然后您可以设置每个线程的
CPU
关联性,以便它与特定的
CPU核心
sched\u setaffinity
pthread\u setaffinity\u np
绑定。它可以是多进程程序,而不是多线程程序one@BasileStarynkevitch:是的。创建多个线程或进程是(相对而言)简单。困难的是如何划分工作,使它们实际上能够独立进行,但在需要时进行协调。我认为线程或进程之间的同步和通信并不容易。我的观点是这很难。@BasileStrynkevitch:我想每个人都同意你的观点。我认为triplee的意思是调用pthread_create很容易。其余的都很难。如果你使用make buildtool,那么你可以使用-j标志,在这里你可以同时执行任务。对于4个内核,你可以给出像
make-j4
,这就是你要问的吗?
是非标准的,可能不推荐使用。使用
@LethalProgrammer:
make-j
是r在构建时提升,而不是在运行时提升time@BasileStarynkevitch,我不确定OP要求的是什么,这就是为什么我只是提出了一个问题来澄清。如果他想在运行时做这件事,那么我同意你的看法,使用
make
,没有任何意义。我适应就像拨动开关一样简单,为什么它不会默认打开?很好!这改变了测试的时间第二个
用于从8.48秒到1.48秒的循环。这是5.7倍的速度,这是我的i7 cpu上的6核所期望的。是否
-ftree parallelize loops=4
仍在gcc中工作?如果是这样,在这个简单的情况下,它可能会工作,编译时间常数为循环的大行程计数。可能是的,但您应该尝试一下(答案可能是特定于编译器版本的)
#pragma omp parallel for
for(i=0; i<8000000000; i++) {
    ptr[i] = i/10000;
}