Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:改进现有的C程序性能_C++_Performance_Visual Studio_Caching_Matrix - Fatal编程技术网

C++ C++;:改进现有的C程序性能

C++ C++;:改进现有的C程序性能,c++,performance,visual-studio,caching,matrix,C++,Performance,Visual Studio,Caching,Matrix,我有一段代码,它给出了将1024x1024个字段的2个矩阵相乘的结果时间: #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])

我有一段代码,它给出了将1024x1024个字段的2个矩阵相乘的结果时间:

#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;

}
#包括
#包括
#包括
#定义NUM 1024
浮动a[NUM][NUM],b[NUM][NUM],c[NUM][NUM];
无效初始化_矩阵(浮点m[][NUM]);
空荷载矩阵(浮点数m[][NUM]);
int main(){
int i,j,k;
时钟为最终时钟;
载荷矩阵(a);
载荷矩阵(b);
初始化_矩阵(c);
printf(“开始矩阵乘法1024x1024…\n\n”);
t_inical=时钟();

对于(i=0;i这取决于您正在使用的编译器。对于,您可以在请求优化后使用(使用
gcc-O3-mtune=native
编译)。在基准测试后仔细使用它,请参见(例如,在
i
j
循环中,获取下一行)


你的代码非常规则,所以可以使用指令给编译器。甚至可以考虑编译一些内核来利用你的.< /p> < p>这取决于你正在使用的编译器。当然,你可以使用它,当然是在请求优化之后(用<代码> Gcc-O3- Munt=原生< /代码>编译)。.在基准测试后仔细使用,请参见(例如,在
i
j
循环中,获取下一行)


<>你的代码是非常规则的,所以可以使用指令到编译器。你甚至可以考虑编译一些内核来利用你的.

一个简单的矩阵乘法的实现不是很好的缓存。你所说的注释可能指的是块,它会在块中进行乘法运算。改进局部性。是一个参考。如果你搜索“缓存块矩阵乘法”你会得到其他的点击。

矩阵乘法的简单实现对缓存不太友好。你听到的评论可能是指块,它将在块中进行乘法以改善局部性。这是一个参考。如果你搜索“缓存块矩阵乘法”您将获得其他点击。

只是交换

for(j=0;j<NUM;j++) 
for(k=0;k<NUM;k++) 
for(j=0;j<NUM;j++) 
  for(j=0;j<NUM;j++) 
    for(k=0;k<NUM;k++) 
(j=0;j只是交换

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

for(j=0;j@Adriano这个问题是3年前提出来的,不是我要问的。@user3288852这里的问题有多老并不重要…@πάνταῥεῖ 这不是我要问的…@user3288852我不认为它的内容过时了。即使在今天,你也会得到很大的提速(3年前缓存大小还不到1KB)。我知道你想提高代码的性能(有人告诉你是因为缓存大小)此外,在回答中,他们提到了许多其他可以做的事情:编译器进行的循环展开(矩阵大小在编译时已知)即使是SIMD…@user3288852:请不要实质性地改变这样的问题。如果你有不同的问题,发表一篇新的帖子。@Adriano这个问题是3年前提的,不是我要问的。@user3288852这里的问题有多老并不重要…@πάνταῥεῖ 这不是我要问的…@user3288852我不认为它的内容过时了。即使在今天,你也会得到很大的提速(3年前缓存大小还不到1KB)。我知道你想提高代码的性能(有人告诉你是因为缓存大小)此外,在回答中,他们提到了许多其他可以做的事情:编译器进行的循环展开(矩阵大小在编译时已知)甚至SIMD…@user3288852:请不要对这样的问题进行实质性的更改。如果您有不同的问题,请发表一篇新的帖子。作为一个实验,我将块迭代封装在一个迭代器中,但我没有对性能或可读性做出任何声明:现在被推广到N个计数器(目前最高为6个),没有模板递归(尽管模板递归的好处可能大于缺点):作为一个实验,我将块迭代封装在一个迭代器中,但我没有对性能或可读性做出任何声明:现在推广到N个计数器(目前最高为6个),没有模板递归(尽管模板递归的好处可能大于缺点):