我正在尝试使用System.Numerics.Vector(T)来矢量化算法并利用CPU的SIMD操作.但是,我的矢量实现比我原来的实现要慢得多.有没有使用可能没有记录的Vector的技巧?这里的具体用途是尝试加速数据的kb.
不幸的是,我在其上找到的几乎所有文档都基于RyuJIT的预发布版本,我不知道有多少这些材料可以移植到.NET Native.
当我在Vector xor操作期间检查反汇编时,它显示:
00007FFB040A9C10 xor eax,eax
00007FFB040A9C12 mov qword ptr [rcx],rax
00007FFB040A9C15 mov qword ptr [rcx+8],rax
00007FFB040A9C19 mov rax,qword ptr [r8]
00007FFB040A9C1C xor rax,qword ptr [rdx]
00007FFB040A9C1F mov qword ptr [rcx],rax
00007FFB040A9C22 mov rax,qword ptr [r8+8]
00007FFB040A9C26 xor rax,qword ptr [rdx+8]
00007FFB040A9C2A mov qword ptr [rcx+8],rax
00007FFB040A9C2E mov rax,rcx
Run Code Online (Sandbox Code Playgroud)
为什么不使用xmm寄存器和SIMD指令呢?同样奇怪的是,SIMD指令是针对此代码的一个版本生成的,我没有明确地向量化,但它们从未被执行,有利于常规寄存器和指令.
我确保我在Release,x64,Optimize代码启用的情况下运行.我看到了x86编译的类似行为.我在机器级别的东西上有点新手,所以它可能只是在这里发生了一些我不能正确理解的东西.
Framework版本为4.6,Vector.IsHardwareAccelerated在运行时为false.
更新: "使用.NET Native工具链编译"是罪魁祸首.启用它会导致Vector.IsHardwareAccelerated == false; 禁用它会导致Vector.IsHardwareAccelerated == true.我已经确认,当禁用.NET Native时,编译器会使用ymm寄存器生成AVX指令.这导致了一个问题......为什么在.NET Native中没有启用SIMD?有什么办法可以改变吗?
更新Tangent:我发现自动SSE矢量化数组代码未被执行的原因是因为编译器插入了一条指令,该指令查看数组的起始位置是否低于最后一个元素之一的地址数组,如果是,只使用普通寄存器.我认为这必定是编译器中的一个错误,因为按照惯例,数组的开头应始终位于比其最后一个元素低的地址.它是测试每个操作数数组的内存地址的一组指令的一部分,我想确保它们不重叠.我已为此提交了Microsoft Connect错误报告:https://connect.microsoft.com/VisualStudio/feedback/details/1831117
正如标题所说:在C#中使用和/或传递匿名方法(Action<>,Func<>)时需要考虑的安全含义是什么?
接受Action<>/ Func<>似乎是将外部代码注入程序的潜在方式的方法.为了记录,我理解注入的方法或函数不能在任意内存访问的意义上做本质上不安全的事情,但我认为它可以允许调用代码调用例如任意.Net框架函数,损坏数据,或以其他方式导致申请行为不端.
这个假设是错的吗?
如果不是,应该怎么做才能锁定这些?另外,有没有办法验证传入方法或函数的
/ Func<>,以确保它是一个预期的形式或限制它对某些类型和命名空间的访问?
另外,请原谅我,如果我没有使用正确的术语,我还在学习.