请优化(不是并行化,而是从cache、函数调用开销、编译等方面优化)下面的串行程序,测试每个优化措施的效果。用Linux环境,编译器不限(gcc,icc等都可以)。以报告形式上传。 #include <stdio.h> #include <stdlib.h> #include <math.h> #define M 1500 #define NM 2000 #define N 2500 void generate_matrix(double *A, long m, long n) { long i, j; for (i=0; i<m; i++) for (j=0; j<n; j++) { A[i*n + j] = rand()/(RAND_MAX+1.0); //0 - 1 A[i*n + j] = 2*A[i*n + j] - 1; //-1 - +1 } } double handle_data(double data) { return sqrt(fabs(data)); } void handle_matrix(double *A, double *B, double *C, long m, long nm, long n) { long i, j, k; double s; for (i=0; i<m; i++) { for (j=0; j<n; j++) { s = 0; for (k=0; k<nm; k++) s += A[i*nm + k] * B[k*n + j]; C[i*n + j] = handle_data(s); } } } double sum_matrix(double *A, long m, long n) { long i, j; double s = 0; for (i=0; i<m; i++) for (j=0; j<n; j++) s += A[i*n + j]; return s; } int main() { double *A = (double *)malloc(M * NM * sizeof(double)); double *B = (double *)malloc(NM * N * sizeof(double)); double *C = (double *)malloc(M * N * sizeof(double)); generate_matrix(A, M, NM); generate_matrix(B, NM, N); struct timeval begin_time, end_time; double run_time_ms; gettimeofday(&begin_time); handle_matrix(A, B, C, M, NM, N); gettimeofday(&end_time); run_time_ms = (end_time.tv_sec - begin_time.tv_sec)*1000 + (end_time.tv_usec - begin_time.tv_usec)*1.0/1000; printf("run_time = %lfms\n", run_time_ms); printf("Sum = %.4f\n", sum_matrix(C, M, N)); free(A); free(B); free(C); return 0; }
时间: 2023-05-24 13:06:52 浏览: 90
10-程序性能优化-并行_5142087311
需要优化的串行程序的具体内容没有提供,因此无法针对具体问题进行优化。一般来说,串行程序的优化可以从以下几个方面入手:
1. 缓存优化:通过优化数据访问模式,减少缓存命中率,提高程序效率。
2. 函数调用开销优化:减少函数的调用次数和调用时间,可以通过内敛函数、去除不必要的参数等方式实现。
3. 编译优化:通过选用合适的编译器选项和优化等级,使程序在编译时尽可能优化,提高程序效率。
在优化时需要进行多组实验,比较原始程序和优化后程序的执行时间和各项性能指标的变化情况,确定最佳的优化方案。具体实验步骤和结果记录可以整理成报告形式上传。
需要注意的是,优化一定程度上是针对具体场景和问题的,不同的情况需要采用不同的优化策略。在优化时需要对编程语言和计算机体系结构有一定的了解。
阅读全文