C++:提高现有 C 程序的性能

标签 c++ performance visual-studio caching matrix

<分区>

我有以下代码给出了乘以 2 个 1024x1024 字段矩阵的结果时间:

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

#define NUM 1024
float a[NUM][NUM],b[NUM][NUM],c[NUM][NUM]; 
void initialize_matrix(float m[][NUM]); 
void load_matrix(float m[][NUM]); 

int main() {

    int i,j,k; 

    clock_t t_inicial,t_final; 
    load_matrix(a); 
    load_matrix(b); 
    initialize_matrix(c); 

    printf("Starting matrix multiplication 1024x1024...\n\n");

    t_inicial=clock();
    for(i=0;i<NUM;i++) 
    for(j=0;j<NUM;j++) 
    for(k=0;k<NUM;k++) 
    c[i][j] =c[i][j] + a[i][k] * b[k][j]; 
    t_final=clock();

    printf("Matrix multiplication finished in: %3.6f seconds",((float) t_final- (float)t_inicial)/CLOCKS_PER_SEC);

} 

void initialize_matrix(float m[][NUM]) {

    int i,j;
    for(i=0;i<NUM;i++) 
    for(j=0;j<NUM;j++) 
    m[i][j]=0.0; 
    return;

} 
void load_matrix(float m[][NUM]) {

    int i,j;
    #pragma omp parallel for
    for(i=0;i<NUM;i++) 
    for(j=0;j<NUM;j++) 
    m[i][j]=(float) 10*rand()/(float) rand(); 
    return;

}

这段代码需要 24 秒才能解决,我被告知缓存存在一些问题。我如何改进此代码以减少时间?花了这么长时间不是很好。

最佳答案

只是交换

for(j=0;j<NUM;j++) 
for(k=0;k<NUM;k++) 

for(k=0;k<NUM;k++) 
for(j=0;j<NUM;j++) 

我的速度提高了 43 倍。就像你说的,改进缓存局部性。

甚至可以通过阻塞(即交换)来缩短一些毫秒

for(j=0;j<NUM;j++) 
  for(j=0;j<NUM;j++) 
    for(k=0;k<NUM;k++) 

通过

for(int i0=0; i0<NUM; i0+=BLK)
  for(int k0=0; k0<NUM; k0+=BLK)
    for(int j0=0; j0<NUM; j0+=BLK)
      for(int i=i0, ix=i0+BLK; i<ix; ++i)
        for(int k=k0, kx=k0+BLK; k<kx; ++k)
          for(int j=j0, jx=j0+BLK; j<jx; ++j)

(我最好的运行是使用 #define BLK 256,但是 YMMV)。

澄清:这是给定@Adriano 引用的链接的答案,您真的应该在编辑问题之前查看它。

关于C++:提高现有 C 程序的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23477157/

相关文章:

c++ - 如何在不过于冗长的情况下获得可变参数模板函数的正确解析

c++ - 将 GTest 集成到我的项目时 gtest-printers.h 出错

c++ - OpenCV 与 std::vector 不兼容? (_crtIsValidHeapPointer 错误)

c++ - 如果灰显,如何访问调试和启动设置?

c++ - 删除一行后留下空行

c++ - Visual C++ x86 上的 volatile 变量和原子操作

c++ - 为什么我的 8M L3 缓存对大于 1M 的阵列没有任何好处?

php - 这段代码的性能很糟糕

c# - 给定数字列表中子系列的数量

c++ - 包括标准头文件。 string.h 还是 cstring?或两者?