首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >每字节负循环?rdtsc C

每字节负循环?rdtsc C
EN

Stack Overflow用户
提问于 2013-07-31 12:19:52
回答 1查看 704关注 0票数 0

我编写了一些代码来测量每个字节的cpu周期。我得到了否定的cpb,但不知道为什么.它向我展示了cpb = -0.855553 cycles/byte

我的伪码

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

uint64_t rdtsc(){
    unsigned int lo,hi;
    __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
    return ((uint64_t)hi << 32) | lo;
}

int main()
{
    long double inputsSize = 1024;
    long double counter = 1;

    long double cpuCycleStart = rdtsc();

        while(counter < 3s)
            function(args);

    long double cpuCycleEnd = rdtsc();

        long double cpb = ((cpuCycleEnd - cpuCycleStart) / (counter *  inputsSize));

    printf("%Lf cycles/byte\n", cpb);

    return 0;
}

编辑,改进代码,结果相同(负):

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

unsigned long rdtsc( void )
    {
        unsigned long lo, hi;
        asm( "rdtsc" : "=a" (lo), "=d" (hi) );
        return( lo );
    }

int main()
{
    long double counter;
    long double inputsSize = 1024;
    char *buff = createInput(inputsSize);

    long double cpuCycleStart = rdtsc();
        countDownTime(3.0);
    for(counter=1; !secondsElapsed; counter++)
            function(args);
    long cpuCycleEnd = rdtsc();

        long double cpb = ((cpuCycleEnd - cpuCycleStart) / (counter *  inputsSize));

    printf("%Lf cycles/byte\n", cpb);

    return 0;
}

真的很奇怪。编写测试代码:

代码语言:javascript
复制
printf("\n%lu cpuCycleEnd \n%lu cpuCycleStart \n", cpuCycleEnd, cpuCycleStart);
    printf("\n%lu counter\n%lu inputsSize \n\n", counter, inputsSize);

        long double cpb = (((long double)cpuCycleEnd - (long double)cpuCycleStart) / ((long double)counter *  (long double)inputsSize));

    printf("%Lf cycles/byte\n", cpb);

这表明:

代码语言:javascript
复制
30534991 cpuCycleEnd 
1139165971 cpuCycleStart 

1273029 counter
1024 inputsSize 

-0.850450 cycles/byte

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-31 12:48:11

您正在为unsigned long为32位的目标进行编译。

您应该使用#include <stdint.h>并使用uint64_t而不是unsigned long。此外,您可能希望为unsigned long为64位的目标进行编译。

(注:打印uint64_t#include <inttypes.h>并使用printf("%" PRIu64 "\n", value);。)

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17970241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档