我正在尝试收集系统信息并在Intel Xeon E5420上注意到以下内容:
执行后CPUID(EAX=1),EDX [28]设置,表示支持超线程,尽管处理器在英特尔网站上列为不支持超线程(ark.intel.com)
有没有人对此有解释?
我正在浏览http://www.ibm.com/developerworks/linux/library/l-gas-nasm/index.html上的一些教程,以熟悉x86/x64.本教程代码使用提供的代码编译和运行,没有打嗝,该代码使用AT&T语法:
.global main
.text
main: # This is called by C library's startup code
mov $message, %rdi # First integer (or pointer) parameter in %edi
call puts # puts("Hello, World")
ret # Return to C library code
message:
.asciz "Hello, World" # asciz puts a 0x00 byte at the end
Run Code Online (Sandbox Code Playgroud)
但是,当我将此代码转换为Intel语法时,我收到"分段错误"错误.
.intel_syntax noprefix
.global main
.text
main: # This is called by C library's startup code
mov rdi, message # First integer (or pointer) parameter in %edi
call …Run Code Online (Sandbox Code Playgroud) 我有一个用GLSL编写的简单的OpenGL 3.3片段着色器.从本质上讲,我正在评估sin(x)适度大的x(10,000到2,000,000之间),如下所示:
#version 330
out vec4 fColor;
void main() {
fColor = vec4(sin(gl_FragCoord.x * gl_FragCoord.y));
}
Run Code Online (Sandbox Code Playgroud)
它在我的NVidia显卡上工作正常,但在我的Intel HD4000上,正弦仅返回四个不同的值(+/- 1.0和大约+/- 0.3),高于大约10,000的输入.
系统:Windows 64bit,(Intel)驱动程序版本15.28.20.64.3347.
我的问题:这是一个错误吗?或者供应商是否可以通过这种方式自由实施正弦?
截至去年9月,我一直在使用基于英特尔i7的笔记本电脑来创建和编译我的程序,但不幸的是显卡坏了,因此我构建了一台基于AMD 4100 FX处理器的预算计算机.
自从我开始使用桌面进行编译以来,我遇到了各种各样的问题,主要问题是我的应用程序在英特尔平台上确实不稳定.
这个问题的最新版本是我的C++代码中的某个函数被破坏,似乎是由于在AMD CPU上进行编译而引起的.为了测试这一点,我很快掌握了AWS(亚马逊网络服务)EC2 micro.t2服务器,从Dreamspark安装了Visual Studio 2008,下载了源代码并进行了编译.果然,没有腐败的功能和源代码生成的DLL完美运行.
我正在使用带有库存编译器的Visual Studio 2008,并运行Windows 8.1(AWS EC2服务器运行Windows Server 2008 R2).我正在尝试编译的代码示例是Crysis Wars SDK,请记住,此代码总是在我的Intel i7 CPU上正常编译.
为什么我的AMD CPU在编译C++应用程序时遇到这么多麻烦?除了继续在AWS EC2服务器上编译我的应用程序,或者在基于英特尔的新PC构建上花钱,我能做些什么吗?
Android Studio告诉我安装HAXM,所以我下载了它,当我去安装时,它说This computer does not support Intel Virtualization Technology.经过一些搜索,我发现如果你在控制面板中取消选中Hyper-V,一切都会好的.我面临的问题是,它甚至没有检查过.有没有其他方法可以解决这个问题,还是我的电脑真的不支持VT-X?
我正在阅读http://www.realworldtech.com/sandy-bridge/,我在理解一些问题时面临一些问题:
专用堆栈指针跟踪器也存在于Sandy Bridge中并重命名堆栈指针,消除了串行依赖性并删除了多个uop.
什么是dedicated stack pointer tracker实际?
对于Sandy Bridge(和P4),英特尔仍然使用术语ROB.但重要的是要理解,在这种情况下,它只引用了飞行中uops的状态数组
事实上它意味着什么?请说清楚.
我在Mac上安装VMware Fusion后遇到错误,无法找到/ dev/vmmon.经过一番挖掘,我了解到只有那么多可用的角色设备,而我所拥有的其他软件已经消耗掉了它们.
由于我主动使用Viscosity和Virtualbox(暂时),我能找到的唯一一个是Intel HAXM驱动程序.
在线说明建议运行脚本来卸载它,但是我的笔记本电脑上不存在该脚本.
我用命令卸载了驱动程序:
sudo kextunload -b com.intel.kext.intelhaxm
Run Code Online (Sandbox Code Playgroud)
我想确定是否还有其他我需要做的事情,这个驱动程序会在启动时尝试重新加载吗?
谢谢!
GCC支持__builtin_clz(int x)内置,它计算参数中前导零(连续最重要的零)的数量.
除了其他东西0之外,这对于有效地实现lg(unsigned int x)函数非常有用,该函数采用基数2的对数x,舍入为1:
/** return the base-2 log of x, where x > 0 */
unsigned lg(unsigned x) {
return 31U - (unsigned)__builtin_clz(x);
}
Run Code Online (Sandbox Code Playgroud)
这部作品在简单的方式-尤其是考虑的情况下x == 1,并clz(x) == 31-再x == 2^0这样lg(x) == 0和31 - 31 == 0我们得到正确的结果.更高的x工作价值.
假设内置程序有效实现,这比备用纯C解决方案更好.
现在,它发生了,计数前导零操作基本上是bsrx86中指令的双重.返回参数中最重要的1位2的索引.因此,如果有10个前导零,则第一个1位位于参数的第21位.一般来说,我们有31 - clz(x) == bsr(x),并在这样bsr …
从这里我知道英特尔近年来实施了几种静态分支预测机制:
80486年龄:永远不被采取
Pentium4年龄:未采取后退/前锋
像Ivy Bridge,Haswell这样的新型CPU变得越来越无形,请参阅Matt G的实验.
英特尔似乎不想再谈论它,因为我在英特尔文档中找到的最新资料大约是十年前写的.
我知道静态分支预测(远远不是)比动态更重要,但在很多情况下,CPU将完全丢失,程序员(使用编译器)通常是最好的指南.当然,这些情况通常不是性能瓶颈,因为一旦频繁执行分支,动态预测器就会捕获它.
由于英特尔不再在其文档中明确声明动态预测机制,因此GCC的builtin_expect()只能从热路径中删除不太可能的分支.
我不熟悉CPU的设计,我不知道究竟是什么机制,目前英特尔使用其静态预测,但我还是觉得英特尔的最佳机制应该清楚地记录他的CPU",我打算去当动态预测失败,向前或向后',因为通常程序员是当时最好的指南.
更新:
我发现你提到的主题逐渐超出我的知识范围.这里涉及一些动态预测机制和CPU内部细节,我在两三天内无法学习.所以请允许我暂时退出你的讨论并充电.
这里仍然欢迎任何答案,也许会帮助更多人
compiler-construction x86 intel cpu-architecture branch-prediction
在16.0中,英特尔C ++编译器提供了两个编译器(一个基于EDG,另一个基于Clang)。
从16.0文档中:
使用命令行
要从命令行调用编译器,请使用类似于以下命令:
对于C源文件:
icc my_source_file.c或icl my_source_file.c对于C ++源文件:
icpc my_source_file.cpp或icl++ my_source_file.cpp成功编译后,编译器会在当前目录中创建一个可执行文件。
icl/icl++是基于Clang的前端。您可以在此编译器中使用Clang选项。icc/icpc是基于EDG的前端。您不能将Clang选项与一起使用icc/icpc。
但是我现在没有看到类似的描述。