标签: cpu

硬盘直接内存访问的目的是什么?

乍一看似乎是一个好主意让硬盘自己写入RAM,没有CPU指令复制数据,特别是考虑到异步网络的成功.但维基百科关于直接内存访问(DMA)的文章指出:

使用DMA,CPU可以从这种开销中解脱出来,并且可以在数据传输期间执行有用的任务(尽管CPU总线会被DMA 部分阻止).

我不明白公交线路是如何"部分阻挡"的.据推测,当时一个设备可以访问内存,然后看起来CPU实际上没有什么有用的工作.它会在第一次尝试读取未缓存的内存时被阻止,我预计在2 mb缓存的情况下会非常快.

释放CPU来执行其他任务的目标似乎是无偿的.硬盘DMA是否会在实践中促进任何性能提升?

memory io cpu system blocking

7
推荐指数
2
解决办法
2985
查看次数

cisc与risc

如果您正在编写教科书,并且需要决定CPU设计来讨论某些问题,您会选择RISC还是CISC?RISC的优点,嗯,你知道:更清洁,更容易,等等.RISC的缺点:与x86相比,我必须使用仿真器,市场上的CPU很少,因此比选择像ARM或SPARC这样的纯RISC CPU的影响要小.我被撕裂了,虽然我倾向于x86和CISC ...许多优点,缺点:不是RISC,所有这些书都像Henessy等.和其他人一样喜欢RISC!因此,总结一下:您会选择RISC或CISC(x86)吗?谢谢.

cpu cpu-architecture

7
推荐指数
2
解决办法
1803
查看次数

CPU如何进行减法

我有一些基本的疑惑,但每次我坐下来试试面试问题时,这些问题和我的怀疑都会出现.

说A = 5

B = -2

我说A + B. 我假设A和B是4字节CPU怎么做这个添加?我知道A的符号位(MSB)为0表示正整数,B的符号位为1表示负整数.

现在在C++程序中,我想打印A + B,ALU(算术逻辑单元)的加法模块首先检查符号位然后决定进行减法然后按照减法程序进行.如何进行减法将是我的下一个问题.

A = 5

B = 2

想要做AB计算机将需要2秒补充B并添加A + 2s补充并返回此(丢弃左侧的额外位)?

A = 2

B = 5

做AB在这种情况下,计算机是如何做的?

我知道任何if-then等类型的条件逻辑都将在ALU内部的硬件中完成.计算2s补码等,丢弃额外的位将全部在ALU内部的硬件中完成.ALU的这个组件是什么样的?

谢谢,

hardware math cpu subtraction alu

7
推荐指数
4
解决办法
2万
查看次数

在CPU中不能使用超过总可用线程的一半

我在运行64位Windows Server 2008 R2 Enterprise的服务器上测试一个程序,它有4个Intel E7-4870处理器,总共40个内核和80个可用线程(我可以在Windows任务管理器中看到80个CPU使用率图表) ).

程序代码如下:

numlist是List包含数百个数字,每个数字都是在某些计算中使用的参数

Parallel.ForEach(numlist, num =>
                 {
                    // do some calculation using parameter = num             
                 });
Run Code Online (Sandbox Code Playgroud)

问题是当我在服务器上运行这个程序时,只有一半的可用线程显示在Windows任务管理器中使用(当然CPU使用率显示为50%),剩下的40个都是完全未使用和空闲.

我还在另一台服务器上测试了相同的程序,该服务器只有2个处理器和24个可用线程,所有24个线程将被完全使用,CPU使用率显示为100%.

有没有什么办法可以让40核CPU服务器运行这个程序并充分利用它所有的80个线程(或接近80个线程)?当仅使用50%的CPU资源时,性能不够好.


这是我正在测试的完整程序代码:

namespace Test
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            Console.WriteLine("Press any key to start");
            Console.ReadLine();
            List<int> numlist = new List<int>();
            for (int i = 0; i < 100; i++)
            {
                numlist.Add(i);
            }

            Parallel.ForEach(numlist, num =>
                                 {
                                 while (true)
                                 {
                                     num++;
                                 }
                             });

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当它在具有2个Intel X5690处理器的服务器上运行时(共有24个线程可用),所有24个线程都被使用,CPU使用率显示为100%;

但是当我在具有80个可用线程的4处理器服务器上运行它时,只使用了40个线程,CPU使用率仅为50%.是否有与此相关的编译器设置?

c# cpu multithreading threadpool parallel.foreach

7
推荐指数
1
解决办法
2750
查看次数

操作系统在实模式下有多好?

x86 CPU有真实和虚幻的模式,与保护模式相反.BIOS提供访问硬件的基本驱动程序.操作系统可以使用这些驱动程序吗?

当然MS-DOS就是那种操作系统,但它也有内存限制问题.

维基百科说,操作系统也必须处于实模式才能使用BIOS驱动程序,因为BIOS是一个实模式程序.还有系统维护模式,但它是否连接到BIOS驱动程序?

基本思想是使用BIOS驱动程序来拥有极小的操作系统.这当然是业余爱好(拥有自己的小型操作系统只是一个令人兴奋的前景).

任何人都可以解释是否可能并且可以访问整个内存?

实模式似乎与CPU不同,也许最新处理器为此模式提供了更多功能.

大多数操作系统都是以保护模式编写的,因为实模式不能执行多任务处理和单独的权限.但对我来说没有多任务和没有特权是可以的,我说的是业余爱好操作系统.重要的是重用BIOS驱动程序,因为编写驱动程序是操作系统开发中最困难的部分.

如果整个操作系统是基于解释器的,则可以"模拟"多任务处理.

总结一下,请分析编写x86 Real Mode OS的可能性,包括磁盘,图形,内存,CPU资源和整体.

cpu assembly operating-system driver hobby-os

7
推荐指数
1
解决办法
2291
查看次数

减少数据库中远程选择的CPU负载

我从一个自定义生产数据库远程选择结果,其标准大约是C#应用程序的三分钟.

每次执行select命令时,我使用CPU的服务器PC都会上升到50%左右.但当然,负载应该在我连接的数据库上?

在检索数据进行读取之前,为什么C#应用程序会升级到50%?

一些背景

  • 我从调试中得出结论,远程数据库上的Select语句大约需要30-40秒,请记住我选择的是使用索引列的条件.
  • 在从远程数据库中选择数据的同时,我监控了TaskManager,并且CPU处于50%,直到选择为完成...这可以持续每个循环大约30-40秒.
  • 如果我在远程数据库的本机sql引擎中选择,则select上没有延迟,立即返回数据(如果有的话).
  • 我知道它不是解析结果集占用CPU负载,因为一些选择将不返回任何内容.

这是我正在使用的一些代码.

OdbcConnection remoteConn = new OdbcConnection(ConfigurationManager.ConnectionStrings["remoteConnectionString"].ToString());

            remoteConn.Open();

            OdbcCommand remoteCommand = new OdbcCommand();
            remoteCommand.Connection = remoteConn;

            using (remoteConn)
            {
                string localSql = "";
                string remoteSql = "select * from tracking where last_update > 212316247440000000"; // Julian No = 2015-07-12 11:24:00

                remoteCommand.CommandText = remoteSql;

                OdbcDataReader remoteReader;

                remoteReader = remoteCommand.ExecuteReader();

                while (remoteReader.Read())
                {


                    for (int i = 0; i < 68; i++)
                    {
                        localSql += ",'" + remoteReader[i].ToString() + "'";
                    }

                }

            }
Run Code Online (Sandbox Code Playgroud)

我对应用程序进行了性能和诊断测试,并得出了这个结果.

在此输入图像描述

如果有的话,我可以如何减少CPU负载甚至完全消除它.它完全不同寻常,我不知道如何去做. …

c# cpu odbc cpu-usage

7
推荐指数
1
解决办法
542
查看次数

检测是否在具有异构CPU架构的设备上运行

我对这一点非常具体.我需要知道,如果该设备具有具有异构内核的CPU等ARM的技术的big.LITTLE,例如,一组4的ARM Cortex-A53的+另一组4更强大的ARM Cortex-A72,共计8个内核,2基本上处理器在同一芯片中.处理器模型并不重要.

我正在考虑的是读取scaling_max_freq所有内核并将那些具有不同最大频率的内容分组(然后比较它们)但我注意到在某些设备中,任何不是cpu0的内核的路径实际上是/ sys/devices /的符号链接system/cpu/cpu0/cpufreq/scaling_max_freq

也就是说,如果我尝试读取cpu3的scaling_max_freq,它将是cpu0的scaling_max_freq的链接.我想知道在这种情况下我是否可以认为我们不是在异构中运行.

CPU类

public final class CPU {
    // To be formatted with specific core number
    private static final String CPU_DIR = "/sys/devices/system/cpu/cpu%d";
    private static final String CPUFREQ_DIR = CPU_DIR + "/cpufreq";
    public static final String SCALING_MAX_FREQ = CPUFREQ_DIR + "/scaling_max_freq";
    private static final String DEFAULT_FREQS = "200000 400000 800000 1200000";

    private CPU() {

    }

    // Here I'd replace 0 with (other) core number
    @NonNull
    public static …
Run Code Online (Sandbox Code Playgroud)

linux cpu android root linux-kernel

6
推荐指数
1
解决办法
148
查看次数

未定义&gt;&gt;&gt; 0 == 4294967295?

在不同的机器上获得不同的结果,并且想知道这是否是预期的行为或某些CPU实施'>>>操作时可能出现的错误?

Linux qemux86-64 4.18.41-yocto-standard #1 SMP PREEMPT Tue Oct 8 20:33:31 UTC 2019 x86_64 GNU/Linux
root@qemux86-64:~# node --v8-options|head -n 1
SSE3=1 SSSE3=1 SSE4_1=0 SAHF=1 AVX=0 FMA3=0 BMI1=0 BMI2=0 LZCNT=0 POPCNT=0 ATOM=0
root@qemux86-64:~# node -v             
v8.12.0
root@qemux86-64:~# node -e 'console.log(undefined >>> 0)'
4294967295
Run Code Online (Sandbox Code Playgroud)

(未定义>>> 0)在我测试的其他计算机上的值为0。但是,然后启用 CPU功能: AVX FMA3 BMI1 BMI2 LZCNT POPCNT

javascript cpu v8 node.js

6
推荐指数
1
解决办法
67
查看次数

ARM 中 TPIDR_EL0/TPIDR_EL1 等线程 ID 寄存器的用途是什么?

根据ARM 文档,线程 ID 寄存器类似于TPIDR_EL0TPIDR_EL1

提供存储软件线程和进程 ID 的位置,以用于操作系统管理目的。这些寄存器对处理器行为没有影响。

为什么有人想要将线程 ID 存储在特殊寄存器中?ARM 处理器是否要求线程在内存中拥有特殊的结构,就像 MMU 一样?线程对于 ARM 来说是特殊的东西吗?ARM 期望在某个地方找到它吗?或者我可以在不使用这个寄存器的情况下(有效地)实现线程吗?

我这么问是因为我在 Fuchsia OS 的 Zircon 内核上找到了这段代码:

static inline void arch_set_current_thread(Thread* t) {
  __arm_wsr64("tpidr_el1", (uint64_t)&t->arch_.thread_pointer_location);
  __isb(ARM_MB_SY);
}
Run Code Online (Sandbox Code Playgroud)

在启动时,它创建一个线程并将其指针存储在tpidr_el1

cpu kernel arm armv8 fuchsia

6
推荐指数
1
解决办法
5180
查看次数

为什么 Intel Core i9-12900K 中的 CPU=8 对所有其他内核的访问速度最快?

这是原来的测试从图中可以看出,Intel Core i9-12900K中的CPU=8对所有其他核心的访问速度是最快的。

因此,我想知道是什么导致了这种情况的发生。

另外,我也很好奇同图中的黄色部分。为什么同一E-core集群中的核心到核心延迟比不同集群中的核心到核心延迟更大?

cpu performance intel cpu-architecture

6
推荐指数
0
解决办法
273
查看次数