专家,我不知道intel x86 machineCode/assemblyCode转换是singleSide还是BothSide?
意思是:assemblyCode ---> machineCode和machineCode ---> assemblyCode都可用.
由于x86 machineCode的大小不同(1-15字节),并且操作码在(1-3字节)中变化,如何确定一个操作码是1byte还是2byte还是3byte?
我从来没有找到x86指令前缀的例子,如果这里是1byte前缀,如何确定它是前缀还是操作码?
当然,assemblyCode ---> machineCode,助记符+ oprand [w/b]的标识可以通过maping某些MappingTable来确定响应machineCode是什么.
但是,当过程逆转时:
{bbbbbbbb,bbbbbbbb,bbbbbbbb,// instruction1 bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,// instruction2 bbbbbbbb,bbbbbbbb // instruction3}
----> {bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb}
我不知道确定一条指令的长度(大小)的重要位或字节.
任何人都会告诉我如何确定?(操作码的大小,前缀示例.)感谢您的帮助.
问题可以描述如下.
输入
__m256d a, b, c, d
Run Code Online (Sandbox Code Playgroud)
产量
__m256d s = {a[0]+a[1]+a[2]+a[3], b[0]+b[1]+b[2]+b[3],
c[0]+c[1]+c[2]+c[3], d[0]+d[1]+d[2]+d[3]}
Run Code Online (Sandbox Code Playgroud)
到目前为止我所做的工作
这看起来很容易:两个VHADD之间有一些混乱,但实际上结合AVX特有的所有排列不能产生实现该目标所需的非常排列.让我解释:
VHADD x, a, b => x = {a[0]+a[1], b[0]+b[1], a[2]+a[3], b[2]+b[3]}
VHADD y, c, d => y = {c[0]+c[1], d[0]+d[1], c[2]+c[3], d[2]+d[3]}
Run Code Online (Sandbox Code Playgroud)
我是否能够以相同的方式置换x和y来获得
x1 = {a[0]+a[1], a[2]+a[3], c[0]+c[1], c[2]+c[3]}
y1 = {b[0]+b[1], b[2]+b[3], d[0]+d[1], d[2]+d[3]}
Run Code Online (Sandbox Code Playgroud)
然后
VHADD s, x1, y1 => s1 = {a[0]+a[1]+a[2]+a[3], b[0]+b[1]+b[2]+b[3],
c[0]+c[1]+c[2]+c[3], d[0]+d[1]+d[2]+d[3]}
Run Code Online (Sandbox Code Playgroud)
这是我想要的结果.
因此,我只需要找到如何执行
x,y => {x[0], x[2], y[0], y[2]}, {x[1], x[3], y[1], y[3]}
Run Code Online (Sandbox Code Playgroud)
不幸的是,我得出的结论是,使用VSHUFPD,VBLENDPD,VPERMILPD,VPERM2F128,VUNPCKHPD,VUNPCKLPD的任何组合都是不可能的.问题的关键在于,在__m256d的实例u中交换u [1]和u [2]是不可能的.
题 …
我需要从处理器(英特尔酷睿i3)中的英特尔随机发生器获取随机数.我不想使用任何库.我想在C++中使用汇编器粘贴,但我不知道哪些寄存器和指令应该使用.
对于多线程编程,考虑到与HPC应用程序(MPI)的组合,哪一个更好,我们可以说,在功能方面,英特尔TBB(线程构建块)是否与pthread相当?我只有开放式mp的经验,但我听说TBB和Pthread提供了比开放式mp更精细的线程控制,但TBB或TBB + OpenMP与pthread相比能提供类似的功能吗?
我尝试用示例或一本好书来搜索intel x64汇编教程,但我甚至没有在intel站点中找到它.
所以,你能给我一个很好的教程或书吗?我在linux上使用nasm.
谢谢
我在Linux上安装了Intel Compiler composer_xe_2013_sp1.3.174.我对icc警告感到困惑.使用简单的程序main.c提供icc,如下所示:
int main(int argc, char **argv) {
int a = 1;
unsigned int b = -22;
if (b = a) {
}
}
Run Code Online (Sandbox Code Playgroud)
我用命令编译了文件:icc -Wall main.c.令人惊讶的是,该命令在没有任何警告的情况下静默工作.我是否必须打开icc上的警告开关?谢谢
我正在编写一些代码,我有一个占位符matmul,似乎工作得很好,但我想使用一个LAPACK dgemm实现.我现在只使用gfortran并获得非常好的速度matmul,但我想知道我是否可以变得更好.
目前的电话是:
C = transpose(matmul( transpose(A), B))
Run Code Online (Sandbox Code Playgroud)
where A,B和C,是非正方形的double precision矩阵.我可以轻松地为dgemm当前的gfortran实现编写一个包装器LAPACK,但我喜欢我可以将所有这些作为一个函数(而不是担心call一个surbroutine并且必须处理transpose).
我想知道如果我编译ifort和包含MKL,这将matmul神奇地改变MKL dgemm为我没有包装的功能?
我自己的处理器支持虚拟化:
我想我也在我的BIOS设置中激活了它.
它是我使用的vmware虚拟机处理器的信息页面(9.0.2 build-1031769)
仍然,当我尝试安装硬件加速执行管理器以启动我的Android虚拟设备时,我采取以下错误:
我该怎么办?
英特尔编译器在循环内生成以下预取指令,以通过a_ptr指针访问数组:
400e93: 62 d1 78 08 18 4c 24 vprefetch0 [r12+0x80]
Run Code Online (Sandbox Code Playgroud)
如果我手动更改(通过十六进制编辑可执行文件)这到非临时预取:
400e93: 62 d1 78 08 18 44 24 vprefetchnta [r12+0x80]
Run Code Online (Sandbox Code Playgroud)
循环运行快了近1.5倍(!!!).但是,我更喜欢编译器为我生成非时间预取.我以为
#pragma prefetch a_ptr:_MM_HINT_NTA
Run Code Online (Sandbox Code Playgroud)
在循环之前应该做的伎俩,但它实际上没有; 它生成的指令与不完整的pragma完全相同.为什么icpc忽略这个pragma?我怎么强迫它生成非时间预取?
选择.据我所知,报告没有说任何有用的内容:
LOOP BEGIN at test-mic.cpp(56,5)
remark #15344: loop was not vectorized: vector dependence prevents vectorization
remark #15346: vector dependence: assumed ANTI dependence between b_ptr line 64 and b_ptr line 65
remark #15346: vector dependence: assumed FLOW dependence between b_ptr line 65 and b_ptr line …Run Code Online (Sandbox Code Playgroud) 错误屏幕截图 我刚刚安装了Android studio,并且正在完成创建新虚拟设备的步骤.我被要求在我选择的同一个向导中下载一些东西,然后点击"接受".这个安装已经进行了很长时间但是没有完成.可以有任何理由吗?我能做什么?