首页 > 解决方案 > X86平台访问外设寄存器很慢

问题描述

我通过DPDK使用AMD的cryptodev,但发现最耗时的其实是DPDK cryptodev驱动中的寄存器访问。

    struct timespec time_start = { 0, 0 }, time_end = { 0, 0 };
    clock_gettime(CLOCK_REALTIME, &time_start);
    printf("start time %lus,%lu ns\n", time_start.tv_sec, time_start.tv_nsec);
    cur_head_offset = CCP_READ_REG(b_info->cmd_q->reg_base, CMD_Q_HEAD_LO_BASE);
    clock_gettime(CLOCK_REALTIME, &time_end);
    printf("end   time %lus,%lu ns\n", time_end.tv_sec, time_end.tv_nsec);
    printf("duration:%lds %ldns\n", time_end.tv_sec-time_start.tv_sec, time_end.tv_nsec-time_start.tv_nsec);

它输出

start time 1616032196s,470511856 ns
end   time 1616032196s,470516756 ns
duration:0s 4900ns
start time 1616032196s,470523966 ns
end   time 1616032196s,470527946 ns
duration:0s 3980ns

就像上面的时间输出一样,一次寄存器访问需要 4us。还有其他方法可以快速访问外设寄存器吗?


在评论区提醒后,我更正了我的测试代码:

    uint64_t start, end;
    start = rte_get_hpet_cycles();
    for (i = 0;i < 1000000; ++i){
        cur_head_offset = CCP_READ_REG(b_info->cmd_q->reg_base,
                        CMD_Q_HEAD_LO_BASE);
    }
    end = rte_get_hpet_cycles();
    printf("start : %lu %lu\n", start, rte_get_hpet_hz());
    printf("end : %lu %lu\n", end, rte_get_hpet_hz());
    double time = (double)(end - start)/(double)rte_get_hpet_hz();
    printf("Average per operation %lf ns\n", time / 1000000 * 1000 * 1000 * 1000);

输出:

start : 2301456683 14318180
end : 2309549122 14318180
Average per operation 565.186288 ns

很好。

标签: x86dpdk

解决方案


推荐阅读