在 avx 指令中用作源的寄存器何时可以在指令开始处理后重用?
例如:我想使用vgatherdps消耗两个 ymm 寄存器的指令,其中之一是位移索引。我意识到vgatherdps收集数据需要花费大量时间,因为数据的局部性较差。
位移索引寄存器是否会在指令执行期间被保留,或者我可以在后续指令中重用它而无需挂起管道?
我正在学习C,请考虑以下代码片段:
#include <stdio.h>
int main(void) {
int fahr;
float calc;
for (fahr = 300; fahr >= 0; fahr = fahr - 20) {
calc = (5.0 / 9.0) * (fahr - 32);
printf("%3d %6.1f\n", fahr, calc);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是将Celsius到华氏温度转换表从300打印到0.我用以下代码编译:
$ clang -std=c11 -Wall -g -O3 -march=native main.c -o main
Run Code Online (Sandbox Code Playgroud)
我还使用此命令生成汇编代码:
$ clang -std=c11 -Wall -S -masm=intel -O3 -march=native main.c -o main
Run Code Online (Sandbox Code Playgroud)
哪个生成1.26kb文件和71行.
我稍微编辑了代码并将逻辑移到另一个函数中,该函数在main()中被初始化:
#include <stdio.h>
void foo(void) {
int fahr;
float calc;
for (fahr = 300; fahr >= …Run Code Online (Sandbox Code Playgroud) 这是在合并流水线和您需要的必要NOP时实现mov和通过x86添加的正确方法.
mov $10, eax
NOP
NOP
NOP
add $2, eax
Run Code Online (Sandbox Code Playgroud)
如果我想用mov更改eax,我可以立即用另一个mov覆盖它,因为你只是覆盖已经存在的内容,或者我是否需要再次写3个NOP才能完成WMEDF循环?
mov $10, eax
mov $12, eax
Run Code Online (Sandbox Code Playgroud)
要么
mov $10, eax
NOP
NOP
NOP
mov $12, eax
Run Code Online (Sandbox Code Playgroud) 维基百科的危害(计算机体系结构)文章:
写后写(WAW)(
i2试图在写操作数之前写操作数i1)在并发执行环境中可能发生写后写(WAW)数据危险。示例例如:
Run Code Online (Sandbox Code Playgroud)i1. R2 <- R4 + R7 i2. R2 <- R1 + R3的写回(WB)
i2必须延迟到i1完成执行为止。
我还不明白
如果i2执行之前有i1什么问题?
如果 Python 是基于 C 编码的(基于),那么 Python 能超越 C 吗?我知道接下来的阶段是汇编、二进制文件,当它们与操作系统和硬件进行通信时。我有两个假设,因为大多数操作系统都是用 C 编码的,那么如果任何代码都在该操作系统之上运行,那么 Python 不可能更快。
我做了一个简单的性能比较,侧重于使用C#的浮点运算,针对带有Windows 10 IoT的Raspberry Pi 3 Model 2,我将它与Intel Core i7-6500U CPU @ 2.50GHz进行了比较.
Raspberry Pi 3 Model B V1.2 - 测试结果 - 图表
英特尔酷睿i7-6500U CPU @ 2.50GHz - x64测试结果 - 图表
英特尔酷睿i7 仅比Raspberry Pi 3 快十二倍(x64)! - 根据那些测试.
准确度为11.67,并计算每个平台在这些测试中实现的最佳性能.两个平台在并行运行的四个线程中实现了最佳性能(非常简单,独立的计算).
问题:测量和比较这些平台的计算性能的正确方法是什么?目的是比较优化算法,机器学习算法,统计分析等领域的计算性能.因此,我的重点是浮点运算.
有一些基准测试(如MWIPS)和MIPS或FLOPS等测量.但我没有找到一种方法来比较不同的CPU平台的计算能力.
我找到了Roy Longbottom的一个比较(谷歌"Roy Longbottom的Raspberry Pi,Pi 2和Pi 3基准" - 我不能在这里发布更多链接)但根据他的基准测试,Raspberry Pi 3的速度只比英特尔酷睿i7快4倍(x64)建筑,MFLOPS比较).与我的结果非常不同.
以下是我执行的测试的详细信息:
测试是围绕应该迭代执行的简单操作构建的:
private static float SingleAverageCalc(float seed, long nTimes)
{
float x1 = seed, x2 = …Run Code Online (Sandbox Code Playgroud) 我必须编写一个应该在 Intel x86 处理器上运行的 x86 汇编代码。
其实要写加法或移动指令之类的,看看这些指令对处理器温度性能的影响。这意味着我的代码应该能够控制处理器产生的热量。
如果您有这样的代码或任何有编写此类代码经验的人,请分享。
assembly ×6
c ×2
x86 ×2
architecture ×1
avx ×1
c# ×1
clang ×1
intel ×1
performance ×1
pipeline ×1
raspberry-pi ×1
simd ×1
temperature ×1