x86 - 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
很好。
解决方案
推荐阅读
- python - 无法将列表转换为 pyspark 数据框中的熊猫数据框
- c++ - 从另一个类更改可生成蓝图的变量(虚幻 C++)
- c# - 如何从 IdentifierNameSyntax 获取 BaseType
- jquery - 整个部分的全页滑动,除了 .swiper-container div Jquery Mobile Swipe
- reactjs - 如何从未在任何地方导入且不返回任何文件的文件调度存储
- numpy - 仅获取 numpy 数组的一个通道的值
- image - 跨两个页面加入图像背景问题
- javascript - 在不使用交互的情况下使用画布在 OpenLayers 中操作图像数据?
- java - 如何让在 WebLogic 服务器上运行的应用程序将 Shiro 消息写入服务器上的日志文件?
- reactjs - React DispatchEvent 未触发 Keydown