将MMX与托管C ++一起使用

时间:2011-02-11 00:32:39

标签: .net c++ clr unmanaged managed

根据我的理解,JIT不会将MSIL编译为将在x86上使用MMX指令的本机机器代码。如果这是真的(因为我很难找到关于此事的最新信息),那么我想要一种在我的代码中使用MMX的方法。我正在研究一个几乎所有单精度浮点数乘法(它是人工神经网络)的应用程序。我基本上围绕这件事有几个问题。

我的第一个问题是,如果我在同一个项目中混合托管和非托管代码,是不是因为“它只是工作”而编译成MSIL?如果我将非托管部件作为静态或动态库,编译它们并在我的托管项目中使用它,我会获得最佳性能吗?

我还研究过将我的GPU与OpenCL(或CUDA一起使用,但是它在ATI上不起作用:()但如果我这样做,那么编译后的GPU代码是否必须从非托管中调用C ++?

总而言之,我只是在寻找获得最快浮点关节炎的最佳方法,同时仍能使用我的托管GUI和多线程,并且使用像MMX这样的扩展似乎是我的最佳选择(如果我只想使用CPU)。做这样事情的最佳方法是什么?

感谢。

3 个答案:

答案 0 :(得分:3)

MMX是一个整数指令集,而不是浮点数。它仅支持64位打包字节,字和双字整数。 SSE有浮点支持。在代码中使用#pragma managed在机器代码和MSIL生成之间切换。

答案 1 :(得分:0)

您可以混合使用托管代码和非托管代码。只有托管编译为MSIL。其余的都是原生的。

托管和非托管之间存在成本......但也不算太差。

所以我写了一个本机库,它可以完成所有高性能的工作,然后从托管代码中使用它。

答案 2 :(得分:0)

  

我的第一个问题是,如果我在同一个项目中混合使用托管代码和非托管代码,是不是因为“它只是工作”而编译成MSIL

没有。如果不使用/clr:pure进行编译,则本机代码可以保留原生代码并与.NET代码混合使用。这称为混合模式组件。 (使用/clr:pure,所有内容都会转换为IL,并且您根本无法使用本机代码。)本机代码将保留原生代码。