在最近升级到.net 4.6之后,我们发现了一个RyuJit产生错误结果的错误,我们现在可以通过在app.config中添加useLegacyJit enabled ="true"来解决这个问题.
如何调试以下生成的机器代码?
我在VS 2015 RTM中创建了一个新的控制台项目,设置为Release,Any CPU,未经检查的Prefer 32 bit,带有和不带调试器的运行产生相同的结果.
using System;
using System.Runtime.CompilerServices;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Calculate());
Console.WriteLine(Calculate());
Console.ReadLine();
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Value Calculate()
{
bool? _0 = (bool?)null;
bool? _1 = (bool?)true;
if (!Value.IsPresent<bool>(_1))
{
return default(Value);
}
bool? result = null;
result = (_1.Value ? new bool?(false) : result);
if (_0.HasValue && _0.Value)
{
}
return new Value(result);
}
public struct Value
{
bool? _value;
public Value(bool? …Run Code Online (Sandbox Code Playgroud) 今天我读了一篇关于MSDN上新的.Net Native的文章.
"使用.NET Native,Windows Store应用程序的启动速度提高了60%,并且内存占用空间更小.我们的第一个版本是开发人员预览版,允许您使用这个新编译器开发和测试应用程序.此.NET预览版提供你用C#的生产力来表现C++".
当然,这真的很有趣但是如果.Net Native是一个新的编译器,它提供了良好的性能,那么为什么我们需要去RyuJIT.什么是新的.Net Native?新的.Net Native和RyuJIT之间有什么区别,微软发布的编译器也称为Roslyn.那么Roslyn如何支持这个新的.Net Native.
TL; DR:为什么包装System.Numerics.Vectors类型很昂贵,有什么我可以做的吗?
考虑以下代码:
[MethodImpl(MethodImplOptions.NoInlining)]
private static long GetIt(long a, long b)
{
var x = AddThem(a, b);
return x;
}
private static long AddThem(long a, long b)
{
return a + b;
}
Run Code Online (Sandbox Code Playgroud)
这将JIT转换为(x64):
00007FFDA3F94500 lea rax,[rcx+rdx]
00007FFDA3F94504 ret
Run Code Online (Sandbox Code Playgroud)
和x86:
00EB2E20 push ebp
00EB2E21 mov ebp,esp
00EB2E23 mov eax,dword ptr [ebp+10h]
00EB2E26 mov edx,dword ptr [ebp+14h]
00EB2E29 add eax,dword ptr [ebp+8]
00EB2E2C adc edx,dword ptr [ebp+0Ch]
00EB2E2F pop ebp
00EB2E30 ret 10h
Run Code Online (Sandbox Code Playgroud)
现在,如果我将它包装在一个结构中,例如
public struct SomeWrapper
{
public long …Run Code Online (Sandbox Code Playgroud) 据我所知,RyuJIT比JIT更快.但它是.NET 4.6的新标准还是Roslyn?
或者,当您需要在编译过程中公开API时,是否使用了Roslyn?
我对他们的目的和他们将要找到的框架感到困惑.有人可以解释这些差异,当你想要一个超过另一个时,请?
我已经为.NET RyuJit安装了新的Jit编译器,并按照安装文档中的描述在regedit中设置了.NetFramework中的AltJit =*键. http://blogs.msdn.com/b/dotnet/archive/2013/09/30/ryujit-the-next-generation-jit-compiler.aspx
那么如何验证RyuJit实际上是否正在使用?
我正在运行一些使用的C#代码,System.Numerics.Vector<T>但据我所知,我没有得到SIMD内在函数的全部好处.我正在使用Visual Studio Community 2015和Update 1,而我的clrjit.dll是v4.6.1063.1.
我正在使用英特尔酷睿i5-3337U处理器,它实现了AVX指令集扩展.因此,我想,我应该能够在256位寄存器上执行大多数SIMD指令.例如,拆卸中应包含的指令vmovups,vmovupd,vaddups,等...,并且Vector<float>.Count应该返回8,Vector<double>.Count应该是4,等等......但是,这不是我所看到的.
相反,我的拆卸包含指令等movups,movupd,addups等...以下代码:
WriteLine($"{Vector<byte>.Count} bytes per operation");
WriteLine($"{Vector<float>.Count} floats per operation");
WriteLine($"{Vector<int>.Count} ints per operation");
WriteLine($"{Vector<double>.Count} doubles per operation");
Run Code Online (Sandbox Code Playgroud)
生产:
16 bytes per operation
4 floats per operation
4 ints per operation
2 doubles per operation
Run Code Online (Sandbox Code Playgroud)
我哪里错了?要查看所有项目设置等,可在此处获得该项目.
阅读宣布.NET Framework 4.6,似乎暗示RyuJIT仅适用于.NET 4.6.
这是否意味着我需要将我的应用程序重新定位到.NET 4.6以使RyuJIT生效?
新的RyuJIT编译器是否曾生成向量(SIMD)CPU指令,何时?
附注:System.Numerics命名空间包含允许显式使用Vector操作的类型,这些操作可能会也可能不会生成SIMD指令,具体取决于CPU,CLR版本,JITer版本,是否直接编译为本机代码.这个问题具体是关于何时非矢量代码(例如在C#或F#中)将产生SIMD指令.
Net 4.6 RC x64的速度是x86(发布版本)的两倍:
考虑一下这段代码:
class SpectralNorm
{
public static void Main(String[] args)
{
int n = 5500;
if (args.Length > 0) n = Int32.Parse(args[0]);
var spec = new SpectralNorm();
var watch = Stopwatch.StartNew();
var res = spec.Approximate(n);
Console.WriteLine("{0:f9} -- {1}", res, watch.Elapsed.TotalMilliseconds);
}
double Approximate(int n)
{
// create unit vector
double[] u = new double[n];
for (int i = 0; i < n; i++) u[i] = 1;
// 20 steps of the power method
double[] v = new …Run Code Online (Sandbox Code Playgroud)