C 使用-m64标志降低性能

C 使用-m64标志降低性能,c,performance,compiler-optimization,C,Performance,Compiler Optimization,我编写了一个简单的过滤器程序,看看-m64编译器选项是否比-m32有性能改进 这是我的全部密码 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/time.h> #define __STDC_FORMAT_MACROS 1 #include<inttypes.h> #define tap_size 5 int luma_stride=640; i

我编写了一个简单的过滤器程序,看看
-m64
编译器选项是否比
-m32
有性能改进

这是我的全部密码

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

#include<sys/time.h>
#define __STDC_FORMAT_MACROS 1
#include<inttypes.h>

#define tap_size 5
int luma_stride=640;
int luma_ht=480;
int croma_stride=320;
int croma_ht=240;

int filter[tap_size]={-3,2,3,2,-3};


struct timeval tv1, tv2,tv3;
uint64_t  ui1;
uint64_t total_time=0;

uint64_t GetTimeStamp();
void process_frame(unsigned char *ip_buffer, unsigned char * op_buffer, int ip_buf_size, int op_buf_size);


int main()
{

    int ip_buf_size;
    int op_buf_size;


    unsigned char * ip_buffer;
    unsigned char * op_buffer;
    unsigned char * temp;



    ip_buf_size=luma_stride*luma_ht + 2*croma_stride * croma_ht;
    op_buf_size=ip_buf_size; //

    ip_buffer = (unsigned char *)malloc(ip_buf_size*sizeof(char));
    op_buffer = (unsigned char *)malloc(ip_buf_size*sizeof(char));;
    temp=ip_buffer;
    for(int i=0;i<ip_buf_size;i++)
    {
        *temp=rand();
    }

    for(int i=0;i<100;i++)
    {
        ui1=GetTimeStamp();
        process_frame(ip_buffer, op_buffer, ip_buf_size, op_buf_size);//process
        total_time+=GetTimeStamp()-ui1;
    }
    free(ip_buffer);
    free(op_buffer);
    printf("\nTotal time=%" PRIu64 " us\n", total_time);
    return 0;
}



uint64_t GetTimeStamp()
{
    struct timeval tv;
    gettimeofday(&tv,NULL);
    return tv.tv_sec*(uint64_t)1000000+tv.tv_usec;
}


void process_frame(unsigned char *ip_buffer, unsigned char * op_buffer, int ip_buf_size, int op_buf_size)
{

    int i,j;
    unsigned char *ptr1,*ptr2;
    unsigned char *temp_buffer=(unsigned char *) malloc(op_buf_size*sizeof(unsigned char));

    ptr1=ip_buffer;
    //ptr2=temp_buffer;
    ptr2=op_buffer;


    //Vertical filter

    //Luma
    /*  for(j=0;j<tap_size/2;j++)
     {
     for(i=0;i<luma_stride;i++)
     {
     *ptr2++=*ptr1++;
     }
     } */

    memcpy(ptr2,ptr1,2*luma_stride*sizeof(unsigned char));
    ptr1=ip_buffer+2*luma_stride;
    ptr2=op_buffer+2*luma_stride;

    for(i=0;i<luma_ht-tap_size+1;i++)
    {

        for(j=0;j<luma_stride;j++)
        {
            int k;
            long int temp=0;
            for(k=0;k<tap_size;k++)
            {
                temp+=filter[k]**(ptr1+(k-tap_size/2)*luma_stride);
            }
            //temp=temp>>4;
            if(temp>255) temp =255;
            else if(temp<0) temp=0;
            *ptr2=temp;
            ++ptr1;
            ++ptr2;
        }

    }

    memcpy(ptr2,ptr1,2*luma_stride*sizeof(unsigned char));
    ptr1=ptr1+2*luma_stride;
    ptr2=ptr2+2*luma_stride;

    //Copy croma values as it is!
    for(i=luma_ht*luma_stride;i<ip_buf_size;i++)
    {
        op_buffer[i]=ip_buffer[i];
    }
}

现在,

/filter32
的输出为

Total time=106807 us
/filter64

Total time=140699 us
我的问题是,这不应该是另一种方式吗?i、 e filter64占用的时间应该少于filter32,因为64位体系结构中有更多的寄存器?我怎样才能做到这一点?或者有任何编译器选项来处理这个问题吗? 请帮忙


我在英特尔64位机上使用Ubuntu。< /P> < P>为什么你使用C++编译器编译C?这会让你的C代码更糟糕,因为你必须做一些可怕的事情,比如不得不这样做

另外,您确定程序的性能受到可用寄存器的限制吗?您需要分析您的程序,以准确地确定时间花在哪里,并确定移动到64位是否/如何使其更快


<> P>这并不像“所有代码在64位时都会更快,因为有更多的寄存器”。

< P>为什么你使用C++编译器编译C?这会让你的C代码更糟糕,因为你必须做一些可怕的事情,比如不得不这样做

另外,您确定程序的性能受到可用寄存器的限制吗?您需要分析您的程序,以准确地确定时间花在哪里,并确定移动到64位是否/如何使其更快


<> P>这并不像“所有代码在64位时都会更快,因为有更多的寄存器”。

< P>为什么你使用C++编译器编译C?这会让你的C代码更糟糕,因为你必须做一些可怕的事情,比如不得不这样做

另外,您确定程序的性能受到可用寄存器的限制吗?您需要分析您的程序,以准确地确定时间花在哪里,并确定移动到64位是否/如何使其更快


<> P>这并不像“所有代码在64位时都会更快,因为有更多的寄存器”。

< P>为什么你使用C++编译器编译C?这会让你的C代码更糟糕,因为你必须做一些可怕的事情,比如不得不这样做

另外,您确定程序的性能受到可用寄存器的限制吗?您需要分析您的程序,以准确地确定时间花在哪里,并确定移动到64位是否/如何使其更快


它不像“为64位构建时,所有代码都会更快,因为有更多的寄存器。”

从32位切换到64位时,会有各种权衡。在不利的一面,所有指针的大小都是原来的两倍,将立即地址加载到寄存器中可能需要更长的指令序列。除非您的应用程序缺少寄存器或需要>4 GB的地址空间,否则您可能希望将其保留为32位

还请注意,您的计时方法有些可疑-您可能只是看到了页面错误等的影响-您应该将测试代码放在一个循环中,内存分配在循环外,处理代码在循环内。出于计时目的,忽略第一次迭代。这样,在开始计时之前,所有内存都已连接,缓存已预热


还有一个问题:您的
进程\u帧中似乎存在内存泄漏,这不仅是一个bug,还可能使计时不可靠。

当您从32位切换到64位时,有各种权衡。在不利的一面,所有指针的大小都是原来的两倍,将立即地址加载到寄存器中可能需要更长的指令序列。除非您的应用程序缺少寄存器或需要>4 GB的地址空间,否则您可能希望将其保留为32位

还请注意,您的计时方法有些可疑-您可能只是看到了页面错误等的影响-您应该将测试代码放在一个循环中,内存分配在循环外,处理代码在循环内。出于计时目的,忽略第一次迭代。这样,在开始计时之前,所有内存都已连接,缓存已预热


还有一个问题:您的
进程\u帧中似乎存在内存泄漏,这不仅是一个bug,还可能使计时不可靠。

当您从32位切换到64位时,有各种权衡。在不利的一面,所有指针的大小都是原来的两倍,将立即地址加载到寄存器中可能需要更长的指令序列。除非您的应用程序缺少寄存器或需要>4 GB的地址空间,否则您可能希望将其保留为32位

还请注意,您的计时方法有些可疑-您可能只是看到了页面错误等的影响-您应该将测试代码放在一个循环中,内存分配在循环外,处理代码在循环内。出于计时目的,忽略第一次迭代。这样,在开始计时之前,所有内存都已连接,缓存已预热


还有一个问题:您的
进程\u帧中似乎存在内存泄漏,这不仅是一个bug,还可能使计时不可靠。

当您从32位切换到64位时,有各种权衡。在不利的一面,所有指针的大小都是原来的两倍,将立即地址加载到寄存器中可能需要更长的指令序列。除非您的应用程序缺少寄存器或需要>4 GB的地址空间,否则您可能希望将其保留为32位

还请注意,您的计时方法有些可疑-您可能只是看到了页面错误等的影响-您应该将测试代码放在一个循环中,内存分配在循环外,处理代码在循环内。出于计时目的,忽略第一次迭代。这样,在开始计时之前,所有内存都已连接,缓存已预热

还有一个问题:您似乎在
进程\u帧
中存在内存泄漏,这不仅是一个bug,还可能导致定时不正确
Total time=106807 us
Total time=140699 us