Linus Torvalds曾经在一家名为Transmeta的处理器公司工作.他们制作的处理器是核心中基于RISC的对象.如果我没记错的话,那就是核心运行了一个任意且可升级的"处理器仿真层"(可能是x86,powerpc等),它将高级操作码转换为RISC核心指令集.
这个想法发生了什么,你认为这种方法在编程方面可能具有优势的优点,缺点和情况如何?
我经常遇到这些术语,并对它们感到困惑.它们是特定于处理器,操作系统还是两者兼有?
我在英特尔i7机器上运行Ubuntu 12.04.那么他们中的哪一个会申请我的案子呢?
x86-64 processor itanium instruction-set computer-architecture
我读到如果DMA可用,那么处理器可以将磁盘块的长读或写请求路由到DMA并专注于其他工作.但是,在此传输过程中,DMA到内存数据/控制通道正忙.处理器在此期间还能做些什么?
处理器数据表中列出了许多不同类型的陷阱,例如BusFault,MemManage Fault,Usage Fault和Address Error.
他们的目的是什么?如何在故障处理中使用它们?
有人可以解释一下,编写一个运行在单核处理器上的多线程代码是否有任何优势?例如,一种处理文档页面的方法,使得页面与上述代码段相互排斥.
乍一看,似乎没有优势,因为真正的多线程是不可能的.即,OS无论如何都必须上下文切换线程.我想知道是否只是以单线程方式编写代码实际上可能更有效.
显然,有很多情况下编写多线程代码是有意义的,但同样,我的问题是当应用程序在单核处理器上运行时是否真的有这样做的优势.
编辑:请注意,我没有说"应用程序"而是"代码段" - 请看上面的示例.显然,拥有一个多线程应用程序是有好处的.
我在Android Studio中收到错误,app无法与其他应用程序通信,两个同时使用的仿真器使用几乎100%的处理器.
我没有收到任何错误,除了"硬件支持HAL太慢,只能写入720帧中的0".在这种情况下我该怎么办?我觉得它的模拟器问题太慢了,是真的吗?
这是我的日志:
04-18 16:57:56.583 1382-1435/? W/audio_hw_generic: Not supplying enough data to HAL, expected position 4321429 , only wrote 4168800
04-18 16:57:57.005 9136-9147/com.example.matt.rider I/art: Background sticky concurrent mark sweep GC freed 20288(877KB) AllocSpace objects, 3(96KB) LOS objects, 0% free, 14MB/14MB, paused 17.734ms total 501.934ms
04-18 16:57:57.289 9136-9147/com.example.matt.rider I/art: Background partial concurrent mark sweep GC freed 5087(243KB) AllocSpace objects, 13(2MB) LOS objects, 26% free, 11MB/15MB, paused 14.179ms total 261.011ms
04-18 16:57:58.703 2420-2432/com.google.android.googlequicksearchbox:search I/art: Background partial concurrent mark sweep GC freed …Run Code Online (Sandbox Code Playgroud) 请原谅我,如果你觉得这已被无数次回答,但我需要回答以下问题!
为什么数据必须对齐(在4字节/ 8字节/ 2字节边界上)?这里我怀疑的是当CPU具有地址线Ax Ax-1 Ax-2 ... A2 A1 A0时,很可能顺序地寻址存储器位置.那么为什么需要在特定边界对齐数据呢?
在编译代码和生成可执行代码时如何找到对齐要求?
如果例如数据对齐是4字节边界,那是否意味着每个连续字节位于模4偏移处?我怀疑的是,如果数据是4字节对齐,那意味着如果一个字节是1004那么下一个字节是1008(或1005)?
我正在实现一个算法(SpookyHash),通过将指针转换为将任意数据视为64位整数(ulong*).(这是SpookyHash如何工作所固有的,重写不这样做不是一个可行的解决方案).
这意味着它最终可能会读取未在8字节边界上对齐的64位值.
在某些CPU上,这很好用.在某些情况下,它会非常缓慢.在其他情况下,它会导致错误(异常或不正确的结果).
因此,我有代码来检测未对齐的读取,并在必要时将数据块复制到8字节对齐的缓冲区,然后再进行处理.
但是,我自己的机器有Intel x86-64.这样可以很好地容忍未对齐的读取,如果我只是忽略对齐问题,它会提供更快的性能,就像x86一样.它还允许memcpy类似于memzero类似的方法处理64字节的块以进行另一次提升.这两项性能改进是相当可观的,足以促使这种优化远未过早.
所以.我有一个非常值得在某些芯片上进行的优化(对于这个问题,可能是两个最有可能运行此代码的芯片),但是会致命或者在其他芯片上表现更差.显然,理想的是检测我正在处理的是哪种情况.
一些进一步要求:
这是一个支持.NET或Mono的所有系统的跨平台库.因此,特定于给定OS的任何内容(例如,P /调用OS调用)都是不合适的,除非它可以在呼叫不可用时安全地降级.
假阴性(确定芯片在实际上是安全的时候对于优化是不安全的)是可以容忍的,误报不是.
昂贵的操作很好,只要它们可以完成一次,然后缓存结果.
该库已经使用了不安全的代码,因此没有必要避免这种情况.
到目前为止,我有两种方法:
首先是用以下内容初始化我的旗帜:
private static bool AttemptDetectAllowUnalignedRead()
{
switch(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE"))
{
case "x86": case "AMD64": // Known to tolerate unaligned-reads well.
return true;
}
return false; // Not known to tolerate unaligned-reads well.
}
Run Code Online (Sandbox Code Playgroud)
另一个是因为用于避免未对齐读取所需的缓冲区复制是使用创建的stackalloc,并且因为在x86(包括32位模式下的AMD64)中,stackalloc64位类型有时可能会返回一个4字节对齐但不是8字节对齐,然后我可以告诉我不需要对齐解决方法,也不要再尝试它:
if(!AllowUnalignedRead && length != 0 && (((long)message) & 7) != 0) // Need to avoid unaligned reads.
{
ulong* buf = stackalloc ulong[2 * …Run Code Online (Sandbox Code Playgroud) 库的许多实现深入到FPATAN所有弧函数的实现.FPATAN是如何实施的?假设我们有1位符号,M位尾数和N位指数,得到这个数字反正切的算法是什么?应该有这样的算法,因为FPU做到了.
我对包含范围 [1, 10000] 中所有唯一元素的数组执行了线性搜索,按所有搜索值(即从 1 到 10000)按递增顺序排序,并绘制了运行时与搜索值图,如下所示:
仔细分析放大版本的情节如下:
我发现一些较大搜索值的运行时间小于较低搜索值,反之亦然
我对这种现象的最佳猜测是,它与 CPU 如何使用主内存和缓存处理数据有关,但没有明确的可量化理由来解释这一点。
任何提示将不胜感激。
PS:代码是用 C++ 编写的,并在 linux 平台上执行,该平台托管在 Google Cloud 上具有 4 个 VCPU 的虚拟机上。运行时间是使用 C++ Chrono 库测量的。