我有一个示例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;
}
Run Code Online (Sandbox Code Playgroud)
Bas*_*tch 10
有没有办法编译C程序,以便它可以使用Linux中的所有CPU核心.
不,不像你想要的那样神奇地发生.程序的并行化是一个非常困难的主题,通常不能自动完成.顺便说一句,并行程序可能没有您希望的那样高效(注意Amdahl定律).
但是,您可以设计并编写并行程序.例如,您可以使用posix线程.小心,这很棘手!先阅读一些Pthread教程.您不确定是否会使用所有核心(因为它们由内核管理),但实际上这很可能.还阅读关于处理器的亲和力.
您也可以使用OpenMP或OpenACC.您可以使用OpenCL编写一些数值内核.您可以使用多处理方法(例如,使用进程间通信分支多个进程),也许使用MPI.另请参阅MapReduce方法,0mq库(以及许多其他方法).
您可以阅读有关操作系统的内容,例如操作系统:三个简单的部分.您还可以阅读有关Linux系统编程的内容,例如高级Linux编程(或一些较新的书籍).另见intro(2)和syscalls(2)&pthreads(7).
请注意,设计,编码和调试并行(或并发或分布式)应用程序非常困难.考虑开发时间的成本(以及获得相关技能所需的时间,可能是几年).有没有银弹!
(将现有的实际顺序应用程序转换为并行应用程序并不现实;您通常必须从头开始设计并行程序)