社区
C语言
帖子详情
问几个底层函数的使用!!
afgkidy
2006-11-29 03:59:04
1. _mm_prefetch
2. _mm_stream_pi
上面2个函数谁知道他作用是什么呢,能说明下吗?急!!
谢谢!!!!!!!!!!!!!!!!!!!
...全文
228
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中的文件主要分为四种:普通文件,目录文件,链接文件,设备文件。将目录和设备当成文件处理能够提高linux的效率,内核如何区分和引用特定的文件,就需要
使用
文件描述符 文件描述符--------它是一个非负的整数,它是一个索引值,指向内核中进程打开文件的记录表,当打开一个文件或者创建一个新文件时,内核就向进程返回一个文件描述符,当需要读写文件时,也需要把文件描述符作为参数传递给相应的
函数
。
函数
的
底层
实现
函数
是什么,怎么用这个就不多说了,基础中的基础,大家都知道。 说一说
函数
的
底层
实现原理。 C语言中,
函数
调用包括三个步骤: 1.调用,调用者将参数传递给被调用者,并交出控制权。 2.执行,被调用者执行任务。 3.被调用者返回结果,并将控制权交还给调用者。 调用机制实现中,
函数
必须是“调用者无关的”,因为一个
函数
可能被不同的调用者调用。 运行时栈 首先,
函数
执行之前,必须在内存...
三面阿里,最后
问
了Synchronized
底层
原理
一谈到多线程安全
问
题,我们总会想到加锁可以解决线程安全的
问
题,JAVA提供的锁有两个,一个是synchronized关键字,另外一个就是lock类。在JDK1.6之前,synchronized是一个重量级锁,
使用
不方便,性能低下。在JDK1.6之后,synchronized进行了很大的优化,加入了偏置锁、轻量级锁、自旋锁等,大大提高了synchronized的性能。现在一起看看Synchroniz...
《编程千
问
》:第十七
问
:什么是
函数
指针?什么是指针
函数
?
在C/C++编程中,
函数
指针和指针
函数
是两个重要的概念,它们在程序设计中有着广泛的应用。
函数
指针是指向
函数
的指针变量。它可以存储
函数
的地址,从而可以通过该指针调用
函数
。指针
函数
是返回指针的
函数
。它的返回值是一个指针类型,可以指向某种数据类型。概念定义常见应用
底层
原理
函数
指针指向
函数
的指针回调
函数
、事件处理、动态调用存储
函数
地址,调用时跳转到该地址指针
函数
返回指针的
函数
动态内存分配、数据结构操作返回地址,允许访
问
或修改数据。
fork()
函数
的
底层
实现原理
在之前的博客 进程控制【创建、等待、终止和替换】 - CSDN博客 https://blog.csdn.net/qq_37964547/article/details/79720027中只是简单的讲到了fork
函数
,但并没有深入,今天在复习知识的时候,就把fork
函数
重新学习了一遍,做了一下总结。 在Linux中,fork
函数
是非常重要的
函数
,他从一个已存在的进程中创建一个新进程;新进程...
C语言
70,038
社区成员
243,245
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章