我有一个示例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;
}
答案 0 :(得分:8)
有没有办法编译C程序,以便它可以使用Linux中的所有CPU内核。
不,不像你想要的那样神奇。 Parallelization计划是一个非常困难的主题,一般不能自动完成。顺便说一下,并行程序可能没有你想要的那么高效(注意Amdahl's law)。
但是,您可以设计和代码并行程序。例如,您可以使用posix threads。小心,这很棘手!先阅读一些Pthread tutorial。您不确定是否会使用所有cores(因为它们由kernel管理),但实际上这很可能。另请阅读processor affinity。
您还可以使用OpenMP或OpenACC。您可以使用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_setaffinity
或pthread_setaffinity_np
允许您设置CPU
亲和力。