标签: intel

将代码加载到GPU(Intel Sandy Bridge)

我的问题不是关于GPGPU.我非常了解GPGPU,这不是我想要的.据称,英特尔的Sand Bridge具有一些功能,允许您直接在GPU上执行计算.

这是真的吗?

我打算编写的代码将采用内联汇编(在C中).是否有汇编指令而不是在CPU上执行将内容输出到GPU?

一些相关文件:

PDF具有指令集.

c assembly gpu intel

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

切换执行单元域时绕过延迟

我试图在切换执行单元的域时理解可能的旁路延迟.

例如,以下两行代码给出了完全相同的结果.

_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停留在同一个域中.这是否意味着第二行代码是更好的解决方案?

assembly sse intel

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

在GCC中编译SSE内在函数会产生错误

我的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.

http://software.intel.com/sites/products/documentation/doclib/iss/2013/compiler/cpp-lin/GUID-7A69898B-BDBB-4AA9-9820-E4A590945903.htm

有没有人尝试过上述方法?有没有人找到将大型代码移植到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 gcc sse intel simd

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

intel_iommu,它是什么?

我的一个客户遇到了Xeon E5机器的问题:他们有一个gpu(我相信它是一个NVIDIA的)悬挂,他们通过添加

intel_iommu = igfx_off
Run Code Online (Sandbox Code Playgroud)

在grub装载机中.

这个价值是什么?它是什么?我读过,但不能简单地说明这一点

intel iommu

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

从真实模式切换到保护模式后跳远

根据本教程,创建一个简单的操作系统就足够了,切换到保护模式就像下面的代码一样简单,无需其他众所周知的操作,如启用A20 ...

无论如何,我是这个领域的新手,我写了下面的代码,因为他们提到了这个SO的修改.

代码结构: 这个简单的操作系统应简要加载如下:

  1. 加载/读取15个扇区
  2. 启用GDT
  3. 切换到保护模式(并打印"成功登陆32位保护模式").
  4. 加载内核并打印"X"

但是,模拟器仍在重新启动.请查看随附的整个代码.

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)

c assembly operating-system intel bootloader

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

应用程序应该如何在64位与32位intel架构中执行?

我想知道在以下场景中普通C++应用程序的相对性能:

  1. 内置为32位应用程序,运行在Intel 64位处理器(x64-64)上
  2. 内置32位应用程序,运行在Intel 32位处理器(x86)上
  3. 内置为64位应用程序.

此外,在修改/开发应用程序以使其在64位处理器上运行更快时,我应该考虑哪些因素?

c++ intel 32bit-64bit

6
推荐指数
3
解决办法
1200
查看次数

将powerpc移植到intel的数字代码使用float提供不同的结果

我的基本问题是如何使用x86上的浮点数运算,就像PowerPC一样,从Classic MacOS(CodeWarrior)到Windows(VS 2008).

有问题的代码,其中有很多,有一堆高度迭代和数值非常敏感的算法.

典型的复杂线是:

Ims_sd = sqrt((4.0*Ams*sqr(nz)-8.0*(Ams+Dms)*nz+12.0*sqr(Ams)) /
         (4.0*sqr(Ams)*(sqr(nz)-1)) - 
         sqr(Ims_av))*sqrt(nz-1);
Run Code Online (Sandbox Code Playgroud)

它是使用typedef'd float作为基类型编写的.

更改为double在两个平台上获得非常相似的结果但不幸的是数字是不可接受的,所以我们不能采取那么简单的方法.

Mac代码是使用CodeWarrior编译的,只是关闭FMADD和FMSUB指令的生成对创建的数字产生了极大的影响.所以,我的出发点是搜索看起来最相似的Visual Studio(2008)选项 - 确保使用融合添加.我们怀疑关键在于编译器在计算中分配中间存储的行为

目前,最好的结果是通过启用SSE2和/fp:fast.启用内部函数会导致值从Mac值进一步偏移.

/ fp的开关文档中说,仅/fp:strict关闭融合添加行为.

MSDN讨论了在LIBC.LIB,LIBCMT.LIB或MSVCRT.LIB之前链接FP10.OBJ.保证64位精度.我显然通过在链接器输入字段上指定FP10.OBJ来实现这一点(详细的链接器输出在MSVCRTD.lib之前显示它).

我也通过调用设置64位精度

_controlfp_s(&control_word, _PC_64, MCW_PC);
Run Code Online (Sandbox Code Playgroud)

在DllMain.

请注意,问题不是由于平台之间的浮点异常处理的差异,也不是由于(令人愉快的)PowerPC允许除零整数(仅返回零)的方式,因为这些区域已经过审计和处理,非常感谢PC-Lint.该程序运行并产生一些可信的输出,只是不够好.

更新:

朋友的一个有趣的评论: 一种可能性是PPC有大量的临时寄存器可以存储64位中间值,而x86代码可能必须卸载并重新加载FPU(截断为4个字节并且丢失精度).

这可能是SSE2更好地工作的原因(IIRC)它有更多的寄存器和更多的保留中间值的范围.

一种可能性 - 您的代码可以编译为64位吗?x64模式还有更多的中间寄存器和更好的FP指令,因此在设计和执行时可能更接近PPC.

64位构建的初始测试实际上越来越接近了,正如他所建议的那样(我首先认为它超调,但这是由于不正确的建模设置).

最终决议

我确信任何对这个主题感兴趣的人都足够强迫他们想知道最终这一切是如何成功的.该软件已完成并提供一致的数字结果.我们从未能够获得所有算法来向Mac提供相同的结果,但它们足够接近统计上可接受的结果.鉴于处理由专家用户指导选择感兴趣的区域并且用户输入部分地反应模型的进展,首席科学家认为这是可接受的(这不是一夜之间的决定!).剩余的数值差异完全在决定不同临床结果的范围内,因此在测试中未发现不同的诊断.

floating-point porting powerpc intel

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

多线程不比单线程快(简单循环测试)

I'm experimenting with some multithreading constructions, but somehow it seems that multithreading is not faster than a single thread. I narrowed it down to a very simple test with a nested loop (1000x1000) in which the system only counts.
Below I posted the code for both single threading and multithreading and how they are executed.
The result is that the single thread completes the loop in about 110 ms, while the two threads also take about 112 ms. …

java performance multithreading multicore intel

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

在6核Intel Xeon中关闭超线程

我们得到了一个12核的MacPro来进行蒙特卡罗计算.它的Intel Xeon处理器启用了超线程(HT),因此实际上应该有24个进程并行运行以充分利用它们.但是,我们的计算效率比12x100%高出24x50%更高效,因此我们尝试Processor在系统首选项中通过窗格关闭超线程以获得更高的性能.人们也可以关闭HT

hwprefs -v cpu_ht=false
Run Code Online (Sandbox Code Playgroud)

然后我们进行了一些测试,这是我们得到的:

  1. 12个并行任务同时运行w /或没有HT让我们失望.
  2. 如果HT关闭,24个并行任务松散20%(不是我们想象的-50%)
  3. 当HT打开时,从24个任务切换到12个任务会使效率降低20%(同样令人惊讶)
  4. 当HT关闭时,从24切换到12不会改变任何东西.

似乎超线程只是降低了我们计算的性能,并且没有办法避免它.我们用于计算的程序是用Fortran编写的,并使用gfortran.有没有办法让这个硬件更高效?


更新:我们的蒙特卡罗计算(MCC)通常是分步进行的,以避免数据丢失和由于其他原因(并不总是可以避免这些步骤).在我们的例子中,每一步都包含许多具有可变持续时间的模拟.由于每个步骤在多个并行任务之间分割,因此它们也具有可变持续时间.基本上,所有更快的任务都必须等到最慢完成.这一事实迫使我们采取更大的步骤,由于平均而导致时间偏差减少,因此处理器不会浪费时间等待.这是我们拥有12*2.66 GHz而不是24*1.33 GHz的动机.如果可以关闭HT,那么通过从24个任务w/HT切换到12个没有HT的任务,我们可以获得大约+ 10%的性能.但是,测试表明我们松了20%.

对于测试,我使用了相当大的步骤,但通常步骤较短,因此效率变得更高.

还有一个原因 - 我们的一些计算需要3-5 GB的内存,因此您可能会看到我们有12个快速任务的经济性.我们正在努力实现共享内存,但它将成为一个冗长的术语项目.因此,我们需要了解如何尽可能快地制作现有的硬件/软件.

macos fortran intel gfortran hyperthreading

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

设置 pip 安装程序要使用的 C 编译器标志

我想在集群上创建一个包含一些 python 包的虚拟环境,其中有不同的英特尔处理器可用(例如 sandy bridge old和 haswell new)。必须从其中进行安装的登录节点是 haswell。

所以我:

pip install virtualenv
cd my_project_folder
virtualenv my_project
Run Code Online (Sandbox Code Playgroud)

如果我这样做,当我登录到沙桥并运行 python 时,我得到:

请确认操作系统和处理器均支持 Intel(R) MOVBE、F16C、FMA、BMI、LZCNT 和 AVX2 指令。

因为 python 可执行文件是使用仅适用于 haswell 节点的编译器标志创建的。我可以告诉 virtualenv 我想使用的 python 可执行文件:

virtualenv -p /usr/bin/python2.7 my_project
Run Code Online (Sandbox Code Playgroud)

但是当我

pip install numpy
Run Code Online (Sandbox Code Playgroud)

他找到并采用了它的haswell编译版本,它不会再次在沙桥拱上运行。

如何指示 pip 不使用使用 haswell 标志编译的包?

出于某些原因,我可以解释我无法使用沙桥处理器创建 virtenv。

python pip intel compiler-flags

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