如何解决X86平台访问外设寄存器很慢
我通过DPDK使用了AMD的cryptodev,但是发现最耗时的其实是在DPDK的cryptdev驱动中注册访问。
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,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
还不错。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。