使用GCC编译C程序,以便它可以使用linux中的所有cpu内核

时间:2017-11-28 09:28:34

标签: c linux gcc

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

有没有办法编译C程序,以便它可以使用Linux中的所有CPU内核。

我曾经像gcc -O3 malloc.c

那样进行编译

代码:

#include <stdio.h>
#include <time.h>
#include <malloc.h>

int main() {
        float *ptr;
        unsigned long long i;

        ptr = (float*) malloc(8000000000 * sizeof(float));

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

        clock_t tic = clock();

        for(i=0; i<8000000000; i++) {
                ptr[i] = (i/10000)+1.0;
        }

        clock_t toc = clock();

        printf("Elapsed: %f seconds\n", (double)(toc - tic) / CLOCKS_PER_SEC);

        return 0;
}

4 个答案:

答案 0 :(得分:8)

  

有没有办法编译C程序,以便它可以使用Linux中的所有CPU内核。

,不像你想要的那样神奇。 Parallelization计划是一个非常困难的主题,一般不能自动完成。顺便说一下,并行程序可能没有你想要的那么高效(注意Amdahl's law)。

但是,您可以设计代码并行程序。例如,您可以使用posix threads。小心,这很棘手!先阅读一些Pthread tutorial。您不确定是否会使用所有cores(因为它们由kernel管理),但实际上这很可能。另请阅读processor affinity

您还可以使用OpenMPOpenACC。您可以使用OpenCL对一些数值内核进行编码。您可以采用multi-processing方法(例如,使用processes分叉多个inter-process communications),也许使用MPI。另请参阅MapReduce方法,0mq库(以及许多其他方法)。

您可以阅读有关操作系统的内容,例如Operating Systems: Three Easy Pieces。您还可以阅读有关Linux系统编程的内容,例如: Advanced Linux Programming(或一些较新的书)。另请参阅intro(2)syscalls(2)&amp; pthreads(7)

请注意设计,编码和调试parallel (或并发或distributed应用非常困难< / strong>即可。考虑获得相关技能所需的开发时间(以及可能years的时间)。有No Silver Bullet

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

答案 1 :(得分:2)

尝试在<div id="search-filter1" class="collapse in"> <div class="filter-margin"> <div class="search-optionfilter"> <span class="activeFiltersCross">Active Filters:</span> <ul class="chosen-choices"> <li class="search-choice"> <div class="badge"> <span data-key="brandName" data-title="3M WATER FILTRATION PRODUCTS" data-text="3M WATER FILTRATION PRODUCTS">3M WATER FILTRATION PRODUCTS</span> <span id="removeFilter" class="filter-result-remove">x</span> </div> </li> </ul> </div> </div> </div>循环正上方添加以下编译指示:

for

在调用gcc时,将#pragma omp parallel for for(i=0; i<8000000000; i++) { ptr[i] = i/10000; } 选项添加到构建选项中。默认情况下,OpenMP将创建与计算机中的核心一样多的线程,并在它们之间平均分配工作负载。

您可以查看此article以获取有关OpenMP的更多信息。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

您可以在程序中创建n(n是内核数量假设)线程,然后您可以设置每个线程的CPU亲和力,使其与特定CPU Core绑定。 sched_setaffinitypthread_setaffinity_np允许您设置CPU亲和力。