社区
C语言
帖子详情
问几个底层函数的使用!!
afgkidy
2006-11-29 03:59:04
1. _mm_prefetch
2. _mm_stream_pi
上面2个函数谁知道他作用是什么呢,能说明下吗?急!!
谢谢!!!!!!!!!!!!!!!!!!!
...全文
226
2
打赏
收藏
问几个底层函数的使用!!
1. _mm_prefetch 2. _mm_stream_pi 上面2个函数谁知道他作用是什么呢,能说明下吗?急!! 谢谢!!!!!!!!!!!!!!!!!!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
凌殿Y_ST
2006-11-29
打赏
举报
回复
http://www.gameres.com/Articles/Program/Other/SSEjianjie.htm 上面的文章,可以看看...
====================================================================================
prefetch 指令的主要目的,是提前讓 CPU 載入稍後運算所需要的資料。通常是在對目前的資料進行運算之前,告訴 CPU 載入下一筆資料。這樣就可以讓目前的運算,和載入下一筆資料的動作,可以同時進行。如果運算的複雜度夠高的話,這樣可以完全消除讀取主記憶體的 latency。不同的 prefetch 指令則是告訴 CPU 將資料載入不同層次的 cache。不過,最常用的還是 prefetchnta,這個指令會把資料載入到離 CPU 最近的 cache 中(通常是 L1 cache 或 L2 cache),適用於資料在短時間內就會用到的情形。
另外 prefetch 指令不會產生任何 exception。它本質上只是一個 hint,CPU 並不一定會真的進行載入的動作。所以,即使 prefetch 一個不合法的記憶體位址,也不會產生錯誤。這讓程式可以不用處理討厭的邊界問題。
除了 prefetch 之外,另一個指令是 movntps,它的 intrinsics 是 _mm_stream_ps。這個指令的用途,是要求 CPU 在寫入資料的時候,不要把資料寫到 cache 中,而是直接將資料寫到主記憶體中。實際上它以 write combining 的方式寫入的。為什麼要這樣做呢?這是因為,很多時候計算的結果並不是立刻需要用到的,通常是很久以後才會用到。所以,這些資料如果被放在 cache 中,完全是浪費空間。而且,更糟的是,它們可能會把 cache 中有用的資料擠掉,而使得這些資料常常需要重新從主記憶體中載入。因此,如果讓這些資料不要被放在 cache 中,就可以避免這種問題。
對上面的程式,加上適當的 prefetch,並利用 movntps 指令,可以修改成類似下面的程式片斷:
__m128 x1 = _mm_load_ps(vec1_x);
__m128 y1 = _mm_load_ps(vec1_y);
__m128 z1 = _mm_load_ps(vec1_z);
__m128 x2 = _mm_load_ps(vec2_x);
__m128 y2 = _mm_load_ps(vec2_y);
__m128 z2 = _mm_load_ps(vec2_z);
_mm_prefetch((const char*)(vec1_x + next), _MM_HINT_NTA);
_mm_prefetch((const char*)(vec1_y + next), _MM_HINT_NTA);
_mm_prefetch((const char*)(vec1_z + next), _MM_HINT_NTA);
_mm_prefetch((const char*)(vec2_x + next), _MM_HINT_NTA);
_mm_prefetch((const char*)(vec2_y + next), _MM_HINT_NTA);
_mm_prefetch((const char*)(vec2_z + next), _MM_HINT_NTA);
__m128 t1 = _mm_mul_ps(x1, x2);
__m128 t2 = _mm_mul_ps(y1, y2);
t1 = _mm_add_ps(t1, t2);
t2 = _mm_mul_ps(z1, z2);
t1 = _mm_add_ps(t1, t2);
_mm_stream_ps(output, t1);
hailongchang
2006-11-29
打赏
举报
回复
http://www.csie.ntu.edu.tw/~r89004/hive/sse/page_7.html
底层
操作的
几个
I/O
函数
本文介绍了Linux系统中文件描述符的概念及其作用,详细解析了open(), close(), read(), write(), lseek()五个
底层
I/O操作
函数
的
使用
方法及语法,并通过一个文件复制的实例程序演示了这些
函数
的应用。
sort
函数
在STL中的
底层
实现
本文深入探讨了STL中sort
函数
的
使用
与
底层
实现,包括默认与扩展用法,以及内省式排序、快速排序与堆排序的切换策略,特别介绍了__introsort_loop
函数
与__final_insertion_sort
函数
的作用。
函数
的
底层
实现
本文探讨了
函数
在C语言中的
底层
实现,包括调用、执行和返回三个步骤。
函数
调用涉及到运行时栈的
使用
,以实现递归调用。通过详细描述
函数
调用时的形式参数传递、活动记录的入栈和出栈,以及控制权的转移,解释了
函数
调用的具体过程。
函数
执行期间,R0~R7寄存器有不同的角色,遵循“调用者保存”和“被调用者保存”规则来维护
函数
调用的状态。
三面阿里,最后
问
了Synchronized
底层
原理
本文详细阐述了synchronized关键字的基本概念、
使用
方法及其
底层
原理。包括synchronized锁的三种
使用
方式,锁的
底层
实现机制,以及JDK1.6后的优化策略,如偏向锁、轻量级锁和重量级锁等。
fork()
函数
的
底层
实现原理
本文详细解析了fork
函数
的
底层
实现,包括其如何通过系统调用clone()和do_fork()创建新进程。还探讨了vfork
函数
,指出它与fork的主要区别在于共享地址空间及执行顺序。同时,介绍了fork调用后的返回值规则,以及如何通过返回值判断当前进程是父进程还是子进程。
C语言
70,038
社区成员
243,247
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章