PCI 预取和非预取内存映射

博主在学习PCI 手册时遇到这两概念,查阅http://blog.csdn.net/ykqnjust/article/details/6236389该博文时,学习了下。自己的总结如下:
1)PCI设置PCIBARx[3]来配置该模式的选择,而该数值又取决于在引导时间的本地配置寄存器的设定;
2)可预取指的是CPU 可缓存它的内容并且对它做所有类型的优化;可预取性内存是指存储器空间的可预取能力。例如如果读操作没有副作用(即如同从 RAM 中读数据一样不会破坏数据),则称存储器空间可预取。必要时可将字节写操作合并成一个双字写操作。可预取是读取一次以后不会改变读取地址和存储状态的任何改变,因为CPU 可缓存它的内容并且对它做所有类型的优化;
3)非预取的内存就象FIFO地址影射到内存地址,读取数据以后会引起FIFO指针的改变.另外还象一些中断状态I/O影射到内存,读取这个内存后,可能会清除中断标志等等,所以CPU不可缓存这个内存地址;
如果满足以下全部条件,则应该设置为可预取的内存状态:
1.多次读(写)一个长字节产生相同的数据;
2.如果主PCI丢弃读数据,将不会发生负的边际效应;
3.地址空间并没有映射为I/O;
4.允许在转发写缓冲器中进行字节合并;
PS:刚开始学习,很多不懂,知识也有很多错误,欢迎指正;

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在OpenBLAS中,可以使用__builtin_prefetch函数来预取矩阵的行和列数据。__builtin_prefetch是GCC编译器提供的内建函数,可以在代码中直接使用。该函数可以将数据预取到CPU的缓存中,以便后续的计算可以更快地访问这些数据。 下面举例说明如何在OpenBLAS中预取矩阵的行和列数据: 1. 预取矩阵的行数据 ```c #define L1_CACHE_LINE_SIZE 64 float A[M*K]; for (int i = 0; i < M; i++) { __builtin_prefetch(&A[i*K], 0, 1); // 预取A的第i行数据 } ``` 在上述代码中,__builtin_prefetch函数用于预取矩阵A的第i行数据。这里使用了L1级别的预取指令,第二个参数为0表示预取到L1缓存,第三个参数为1表示预取读取数据后立即触发数据传输,即预取A的下一行数据。 2. 预取矩阵的列数据 ```c #define L1_CACHE_LINE_SIZE 64 float B[K*N]; for (int j = 0; j < N; j++) { __builtin_prefetch(&B[j*K], 0, 1); // 预取B的第j列数据 } ``` 在上述代码中,__builtin_prefetch函数用于预取矩阵B的第j列数据。这里使用了L1级别的预取指令,第二个参数为0表示预取到L1缓存,第三个参数为1表示预取读取数据后立即触发数据传输,即预取B的下一列数据。 需要注意的是,在使用预取指令时,应该根据实际情况进行调整,以避免对性能产生负面影响。此外,预取指令只是一种优化技巧,其效果取决于预取数据的大小、预取方式、预取距离等因素。在实际应用中,应该结合具体的场景进行使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值