Tag: 指令集

primefacesx86指令的alignment要求

Microsoft提供InterlockedCompareExchange函数来执行primefaces比较和交换操作。 还有一个_InterlockedCompareExchange 内部 。 在x86上,这些是使用cmpxchg指令来实现的。 但是,通过阅读这三种方法的文件,他们似乎并不同意alignment要求。 英特尔的参考手册没有提到任何关于alignment的内容(除了如果启用了alignment检查并产生未alignment的内存引用,则会产生exception) 我也查了一下lock前缀,具体说明了这一点 LOCK前缀的完整性不受内存字段alignment的影响。 (重点是我的) 所以英特尔似乎认为这种联合是无关紧要的。 无论如何,这个操作都是primefaces的。 _InterlockedCompareExchange内在的文档也没有说alignment,但是InterlockedCompareExchange 函数声明 该函数的参数必须在32位边界上alignment; 否则,该function在多处理器x86系统和任何非x86系统上将performance不可预知。 那么给了什么? InterlockedCompareExchange的alignment要求只是为了确保该函数即使在cmpxchg以前的cmpxchg指令不可用的情况下也能正常工作? 这似乎可能基于上述信息,但我想确定之前,我依靠它。 🙂 或者ISA需要alignment以保证primefaces性,而我只是在英特尔的参考手册中查找错误的地方?

LEA EAX,EAX有什么意义?

LEA EAX, [EAX] 我在用Microsoft C编译器编译的二进制文件中遇到了这个指令。 这显然不能改变EAX的价值。 那为什么呢?

如何检查CPU是否支持SSE3指令集?

以下代码是否有效,以检查CPU是否支持SSE3指令集? 使用IsProcessorFeaturePresent()函数显然在Windows XP上不起作用(请参阅http://msdn.microsoft.com/zh-cn/library/ms724482(v=vs.85).aspx )。 bool CheckSSE3() { int CPUInfo[4] = {-1}; //– Get number of valid info ids __cpuid(CPUInfo, 0); int nIds = CPUInfo[0]; //– Get info for id "1" if (nIds >= 1) { __cpuid(CPUInfo, 1); bool bSSE3NewInstructions = (CPUInfo[2] & 0x1) || false; return bSSE3NewInstructions; } return false; }

如何控制一个进程运行的核心?

我可以理解如何编写一个使用多个进程或线程的程序:fork()一个新进程并使用IPC,或者创build多个线程并使用这些types的通信机制。 我也理解上下文切换。 也就是说,只有一个CPU,操作系统为每个进程安排时间(并且有大量的调度algorithm在那里),从而实现同时运行多个进程。 而现在我们有了多核处理器(或者多处理器的计算机),我们可以在两个独立的内核上同时运行两个进程。 我的问题是关于最后的情况:内核如何控制一个进程运行的核心? 哪些系统调用(在Linux甚至Windows中)在特定内核上调度进程? 我问这个问题的原因是:我正在为一个项目寻找计算方面的最新课题 – 我select了多核架构。 在如何在这种环境下编程(如何监视死锁或竞赛状况)似乎有很多材料,但在控制单个核心本身方面却没有太多的材料。 我希望能够编写一些演示程序,并给出一些汇编指令或C代码,以便大意:“看,我在第二个内核上运行一个无限循环,查看特定内核的 CPU利用率高峰” 。 任何代码示例? 还是教程? 编辑:澄清 – 很多人都说这是操作系统的目的,而且应该让操作系统照顾这个。 我完全同意! 但是,我所要求的(或试图去感受)是操作系统实际做到的。 不是调度algorithm,而是更多“一旦核心被选中,必须执行什么指令才能让核心开始获取指令?

MOV和LEA有何区别?

我想知道这些说明之间的区别是什么: MOV AX, [TABLE-ADDR] 和 LEA AX, [TABLE-ADDR]