英特尔在x86处理器中实现了哪种整数除法算法?
我刚刚在我的笔记本电脑上安装了Ubuntu 13.10,不是作为升级而是作为干净安装.
一切都很好,除了我现在正试图从官方页面安装英特尔图形驱动程序并遇到依赖性错误.
该软件包是要求libpackagekit-glib2- 14和缺乏列入回购失败(据我可以告诉).我有libpackagekit-glib2- 16安装,但据我可以告诉有没有办法恢复到14,或者一起安装.
如果有人能给我一些解决方案的指导,我将非常感激.
我试图在切换执行单元的域时理解可能的旁路延迟.
例如,以下两行代码给出了完全相同的结果.
_mm_add_ps(x, _mm_castsi128_ps(_mm_slli_si128(_mm_castps_si128(x), 8)));
_mm_add_ps(x, _mm_shuffle_ps(_mm_setzero_ps(), x, 0x40));
Run Code Online (Sandbox Code Playgroud)
哪一行代码更好用?
第一行的汇编输出给出:
vpslldq xmm1, xmm0, 8
vaddps xmm0, xmm1, xmm0
Run Code Online (Sandbox Code Playgroud)
第二行的汇编输出给出:
vshufps xmm1, xmm0, XMMWORD PTR [rcx], 64 ; 00000040H
vaddps xmm2, xmm1, XMMWORD PTR [rcx]
Run Code Online (Sandbox Code Playgroud)
现在,如果我看一下Agner Fog的微体系结构手册,他给出了第112页的一个例子,在浮点值上使用整数shuffle(pshufd),而在float值上使用float shuffle(shufps).交换域增加了4个额外的时钟周期,因此使用shufps的解决方案更好.
我列出的第一行代码_mm_slli_si128必须在整数和浮点向量之间切换域.第二个使用_mm_shuffle_ps停留在同一个域中.这是否意味着第二行代码是更好的解决方案?
我的SSE代码在Windows平台上运行得很好,但是当我在Linux上运行时,我遇到了很多问题.其中一个是:
这只是我的代码的示例说明:
int main(int ref, int ref_two)
{
__128i a, b;
a.m128i_u8[0] = ref;
b.m128i_u8[0] = ref_two;
.
.
.
.....
}
Run Code Online (Sandbox Code Playgroud)
错误1:
错误:请求成员'm128i_u8'不是结构或联合
在这个线程中,它提供了使用适当的_mm_set_XXX内在函数而不是上述方法的解决方案,因为它只适用于Microsoft. SSE内在函数编译带有GCC错误的MSDN代码?
我尝试了我在程序中替换set指令的线程中提到的上述方法,但它严重影响了我的应用程序的性能.
我的代码很庞大,需要在2000个地方更改.所以我在寻找更好的替代方案,而不会影响我的应用程序的性能.
最近我从英特尔获得了这个链接,它说使用-fms-diaelect选项将它从Windows移植到Linux.
有没有人尝试过上述方法?有没有人找到将大型代码移植到Linux的解决方案?
@Paul,这是我的代码,我已经放置了一个计时器来测量两种方法所花费的时间,结果令人震惊.
代码1:115毫秒(直接访问元素的Microsoft方法)
代码2:151 ms(使用设置指令)
当我在代码中使用set时,它花了我36毫秒.
注意:如果我在我的单个指令中替换它需要36毫秒,并想象如果我在我的程序中将它替换2000次,性能会降低.
这就是我寻找除设定指令之外的更好选择的原因
代码1:
__m128i array;
unsigned char* temp_src;
unsigned char* temp_dst;
for (i=0; i< 20; i++)
{
for (j=0; j< 1600; j+= 16)
{
Timerstart(&x);
array = _mm_loadu_si128 ((__m128i *)(src));
array.m128i_u8[0] = 36;
y+ = Timerstop(x);
_mm_store_si128( (__m128i *)temp_dst,array);
}
}
Run Code Online (Sandbox Code Playgroud)
代码2: …
在兼容x86的加速器MIC Intel Xeon Phi中是否有SIMD(SSE/AVX)指令?
我的一个客户遇到了Xeon E5机器的问题:他们有一个gpu(我相信它是一个NVIDIA的)悬挂,他们通过添加
intel_iommu = igfx_off
Run Code Online (Sandbox Code Playgroud)
在grub装载机中.
这个价值是什么?它是什么?我读过,但不能简单地说明这一点
我正在使用英特尔内在函数编写程序.我想使用_mm_permute_pd内在的,仅在具有AVX的CPU上可用.对于没有AVX的CPU我可以使用,_mm_shuffle_pd但根据规格它比它慢得多_mm_permute_pd.英特尔内部函数的头文件是否定义了允许我区分是否支持AVX的常量,以便我可以这样写:
#ifdef __IS_AVX_SUPPORTED__ // is there sth like this defined?
// use _mm_permute_pd
# else
// use _mm_shuffle_pd
#endif
Run Code Online (Sandbox Code Playgroud)
?我找到了这个教程,它展示了如何执行运行时检查,但我需要对当前机器进行静态的编译时检查.
我正在学习OpenCL编程,并注意到一些奇怪的东西.
也就是说,当我在我的机器上列出所有支持OpenCL的设备(Macbook Pro)时,我得到以下列表:
第一个是我的CPU,第二个是英特尔的板载图形解决方案,第三个是我的专用显卡.
研究表明,英特尔已将其硬件OpenCL兼容,以便我可以利用板载图形单元的强大功能.那将是Iris Pro.
考虑到这一点,CPU与OpenCL兼容的目的是什么?仅仅为了方便,内核可以在CPU上运行,因为备份不应该找到其他卡,或者当运行代码作为OpenCL内核而不是常规(C,良好线程)程序时,是否存在任何速度优势中央处理器?
在x86或amd64上使用汇编指令时,程序员可以使用"Intel"(即nasm编译器)或"AT&T"(即gas编译器)汇编语法."Intel"语法在Windows上更受欢迎,但"AT&T"在UNIX(类似)系统上更受欢迎.
但是英特尔和AMD手册,以及芯片创建者创建的手册都使用"英特尔"语法.
我想知道,"AT&T"语法设计背后的原始想法是什么?浮动处理器创建者使用的符号有什么好处?
根据本教程,创建一个简单的操作系统就足够了,切换到保护模式就像下面的代码一样简单,无需其他众所周知的操作,如启用A20 ...
无论如何,我是这个领域的新手,我写了下面的代码,因为他们提到了这个SO的修改.
代码结构: 这个简单的操作系统应简要加载如下:
但是,模拟器仍在重新启动.请查看随附的整个代码.
bootloader.asm
[bits 16]
[org 0x7C00]
KERNEL_OFFSET equ 0x1000
xor ax, ax
mov ds, ax
mov es, ax
mov [BOOT_DRIVE], dl
mov ax, 0x07E0 ; End of stack
cli
mov ss, ax
mov sp, 0x1200 ; Size of Stack. By this, we assume that stack starts at 9000h
; of size 1200h and ends at 7E00h to avoid being overwritten.
sti
call load_kernel
call switch_to_pm
jmp $ …Run Code Online (Sandbox Code Playgroud)