Tag: intel

为什么AVX-256 VMOVAPS指令只复制四个单精度浮点而不是8?

我试图熟悉一些较新的英特尔处理器上提供的256位AVX指令。 我已经validation我的i7-4720HQ支持256位AVX指令。 我遇到的问题是VMOVAPS指令,它应该复制8个单精度浮点值,只复制4。 dot PROC VMOVAPS YMM1, ymmword ptr [RCX] VDPPS YMM2, YMM1, ymmword ptr [RDX], 255 VMOVAPS ymmword ptr [RCX], YMM2 MOVSS XMM0, DWORD PTR [RCX] RET dot ENDP 如果您不熟悉调用约定,Visual C ++ 2015期望在返回时返回此函数(因为它是一个浮点数)在XMM0中。 除此之外,标准是第一个参数在RCX中传递,第二个参数在RDX中传递。 这是调用此函数的C代码。 _declspec(align(32)) float d1[] = { 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f }; _declspec(align(32)) float d2[] = { […]

在程序集中调用C函数

尽管我到处搜索,但我找不到解决问题的方法。问题是我在C文件“hello.c”中定义了一个函数“hello_world()”,我想在汇编文件中调用此函数。 “hello_assembly.asm”。任何人都可以帮帮我吗? 谢谢。

为什么这个IA32汇编代码有三个leal指令?

我编译了这个C函数: int calc(int x, int y, int z) { return x + 3*y + 19*z; } 我在calc.s中得到了这个,我正在注释正在发生的事情: .file “calc.c” .text .globl calc .type calc, @function calc: pushl %ebp //Save paramaters movl %esp, %ebp //Move stack pointer into %ebp movl 12(%ebp), %eax //Move y into %eax movl 16(%ebp), %ecx //Move z into %ecx leal (%eax,%eax,2), %eax […]

将指令的目标地址保持在寄存器中,直到指令退出为止

我想在XeonE5 Sandy Bridge上使用精确的基于事件的采样(PEBS)来记录特定事件的所有地址(例如缓存未命中)。 但是, Core TM i7处理器和Intel®XeonTM5500处理器性能分析指南 (第24页)包含以下警告: 由于PEBS机制在指令完成时捕获寄存器的值,因此无法重建以下类型的加载指令(Intel asm约定)的解除引用的地址。 MOV RAX, [RAX+const] 这种指令主要与指针追逐有关 mystruc = mystruc->next; 这是捕获存储器指令地址的这种方法的重大缺点。 根据objdump,我在程序中有许多该表单的加载指令。 有什么办法可以避免吗? 由于这是一个特定于英特尔的问题,解决方案不必以任何方式移植,它只需要工作。 我的代码是用C语言编写的,我理想地寻找编译器级解决方案(gcc或icc),但欢迎任何建议。 一些例子: mov 0x18(%rdi),%rdi mov (%rcx,%rax,8),%rax 在这两种情况下,在指令退出之后(因此当我查看寄存器值以确定我加载到/来自的位置时)地址的值(在这些示例中分别为%rdi + 18和%rcx + 8 * %rax )被mov的结果覆盖。

英特尔TBB将在AMD处理器上运行?

可能重复: AMD多核编程 英特尔TBB处理器是否依赖? 它会在amd或ARM上运行吗(例如在meeGo下?)

CLFLUSH如何处理尚未缓存的地址?

我们正在尝试使用Intel CLFLUSH指令在用户空间中刷新Linux中进程的缓存内容。 我们创建了一个非常简单的C程序,它首先访问一个大型数组,然后调用CLFLUSH来刷新整个数组的虚拟地址空间。 我们测量CLFLUSH刷新整个arrays所需的延迟。 程序中arrays的大小是一个输入,我们将输入从1MB变为40MB,步长为2MB。 根据我们的理解,CLFLUSH应该刷新缓存中的内容。 所以我们期望看到整个arrays的刷新延迟首先在arrays大小方面线性增加,然后在arrays大小大于20MB(这是我们程序的LLC的大小)之后延迟应该停止增加。 然而,实验结果非常令人惊讶,如图所示。 数组大小超过20MB后,延迟不会停止增加。 我们想知道如果地址不在缓存中,CLFLUSH是否可能在CLFLUSH将地址刷出缓存之前引入地址? 我们还尝试在英特尔软件开发人员手册中进行搜索,但没有找到任何解释,如果地址不在缓存中,CLFLUSH会做什么。 以下是我们用于绘制图形的数据。 第一列是以KB为单位的数组大小,第二列是以秒为单位刷新整个数组的延迟。 任何建议/建议都不仅仅是值得赞赏的。 [改性] 以前的代码是不必要的。 尽管CLFLUSH具有相似的性能,但它可以更容易地在用户空间中完成。 所以我删除了凌乱的代码以避免混淆。 SCENARIO=Read Only 1024,.00158601000000000000 3072,.00299244000000000000 5120,.00464945000000000000 7168,.00630479000000000000 9216,.00796194000000000000 11264,.00961576000000000000 13312,.01126760000000000000 15360,.01300500000000000000 17408,.01480760000000000000 19456,.01696180000000000000 21504,.01968410000000000000 23552,.02300760000000000000 25600,.02634970000000000000 27648,.02990350000000000000 29696,.03403090000000000000 31744,.03749210000000000000 33792,.04092470000000000000 35840,.04438390000000000000 37888,.04780050000000000000 39936,.05163220000000000000 SCENARIO=Read and Write 1024,.00200558000000000000 3072,.00488687000000000000 5120,.00775943000000000000 7168,.01064760000000000000 9216,.01352920000000000000 11264,.01641430000000000000 13312,.01929260000000000000 15360,.02217750000000000000 17408,.02516330000000000000 19456,.02837180000000000000 21504,.03183180000000000000 23552,.03509240000000000000 […]

_builtin_prefetch()中第二个参数的影响是什么?

这里的GCC doc指定了_buitin_prefetch的用法。 第三个论点是完美的。 如果为0,则编译器生成prefetchtnta(%rax)指令如果为1,编译器生成prefetcht2(%rax)指令如果为2,则编译器生成prefetcht1(%rax)指令如果为3(默认值),则编译器生成prefetcht0 (%rax)指令。 如果我们改变第三个参数,操作码已经相应地改变了。 但第二个论点似乎没有任何影响。 __builtin_prefetch(&x,1,2); __builtin_prefetch(&x,0,2); __builtin_prefetch(&x,0,1); __builtin_prefetch(&x,0,0); 以上是生成的示例代码: 以下是assembly: 27: 0f 18 10 prefetcht1 (%rax) 2a: 48 8d 45 fc lea -0x4(%rbp),%rax 2e: 0f 18 10 prefetcht1 (%rax) 31: 48 8d 45 fc lea -0x4(%rbp),%rax 35: 0f 18 18 prefetcht2 (%rax) 38: 48 8d 45 fc lea -0x4(%rbp),%rax 3c: 0f 18 […]

从C调用的Intel 8086汇编程序

我需要为汇编语言开发一个过程,并从C语言调用该过程(传递一个字符串并返回一个整数值)。 我的assembly程序很好“独立”。 我需要帮助将它们连接在一起。 程序应该在Intel 8086上运行。我需要使用MASM或emu8086作为汇编程序/模拟器。 请推荐一个C编译器,以及制作能够调用汇编过程并获取返回值的简单C程序的方法。 如何将字符串传递给此外部函数? 如何连接ASM文件和C文件? (编译器如何知道此过程的定义/代码在哪里?) 如何从汇编语言中获取从C发送的字符串,以及如何将整数返回到C?

__m256类型的intel内在函数问题

我正在尝试测试一些英特尔内部函数,看看它们是如何工作的。 所以,我创建了一个函数来为我做这个,这是代码: void test_intel_256() { __m256 res,vec1,vec2; __M256_MM_SET_PS(vec1, 7.0, 7.0, 7.0, 7.0, 7.0, 7.0, 7.0, 7.0); __M256_MM_SET_PS(vec1, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0); __M256_MM_ADD_PS(res,vec1,vec2); if (res[0] ==9 && res[1] ==9 && res[2] ==9 && res[3] ==9 && res[4] ==9 && res[5] ==9 && res[6] ==9 && res[7] ==9 ) printf(“Addition : OK!\n”); else […]

逻辑CPU计数返回16而不是4

我有一个Intel Core i5-2450m(2个物理处理器和4个逻辑处理器),我想找到一种方法来计算AMD和Intel CPU上的逻辑和物理内核。 但是,经过一些搜索,我注意到了一些奇怪 我的代码给了我16而不是返回4个逻辑单元。 static int8_t LogicalProcCount(void) { if ( !Hyperthreading ) return 1; uint32_t unused, ebx; CPUID(1, unused, ebx, unused, unused); return (int8_t) ( (ebx >> 16 ) & 0xFF ); }