我的C++代码使用SSE,现在我想改进它以支持AVX可用时.所以我检测AVX何时可用并调用使用AVX命令的函数.我使用Win7 SP1 + VS2010 SP1和带AVX的CPU.
要使用AVX,必须包含以下内容:
#include "immintrin.h"
Run Code Online (Sandbox Code Playgroud)
然后你可以使用内在的AVX函数_mm256_mul_ps,_mm256_add_ps等等.问题是,默认情况下,VS2010产生的代码工作得非常慢,并显示警告:
警告C4752:发现英特尔(R)高级矢量扩展; 考虑使用/ arch:AVX
似乎VS2010实际上不使用AVX指令,而是模仿它们.我添加/arch:AVX到编译器选项并获得了良好的结果.但是这个选项告诉编译器尽可能在任何地方使用AVX命令.所以我的代码可能会崩溃在不支持AVX的CPU上!
所以问题是如何使VS2010编译器生成AVX代码,但只有当我直接指定AVX内在函数时.对于它工作的SSE,我只使用SSE内在函数,它产生SSE代码,没有任何编译器选项,如/arch:SSE.但对于AVX而言,由于某些原因它不起作用.
我是WPF的新手,虽然我有一些WinForms的经验.我只想为我动态创建的几个对象添加ContextMenu,但我在VS工具箱中找不到ContextMenu组件.我找到的唯一方法是在运行时创建ContextMenu,如下所示:
ContextMenu pMenu = new ContextMenu();
MenuItem item1 = new MenuItem();
MenuItem item2 = new MenuItem();
//I have about 10 items
//...
item1.Header = "item1";
item1.Click += new RoutedEventHandler(item1_Click);
pMenu.Items.Add(item1);
item2.Header = "item2";
item2.Click += new RoutedEventHandler(item2_Click);
pMenu.Items.Add(item2);
//and so on
Run Code Online (Sandbox Code Playgroud)
但是,在WinForms中,我可以将ContextMenuStrip组件放到我的表单中,并且可以非常快速地定义项目和事件,而无需编写任何代码.在WPF中有可能吗?
微软表示VS2010支持全套AVX指令:
...在VS2010版本中,所有AVX功能和指令都通过内在和完全支持/arch:AVX....
但是我找不到任何用于融合乘法运算的内在函数
我需要使用_mm256_fmadd_ps函数,但它在"immintrin.h"标题中缺失.我真的很困惑.
我用C#应用程序创建了C++中的COM服务器.现在我必须向我的COM对象添加一个方法,其中一个参数必须是回调函数的函数指针.C++原始函数如下所示:
typedef int (__stdcall *tCallBackFunc)(int Param);
void MyFunc(void* CallBackFunc)
{
int Param;
//some code
((tCallBackFunc)(CallBackFunc))(Param); //call callback function
}
Run Code Online (Sandbox Code Playgroud)
我需要添加MyFunc作为COM对象方法.VS VC++"添加方法"对话框为COM方法参数提供了一些预定义类型,如"int*"或"bstr",我试图将"CallBackFunc"参数定义为"int*"类型,但我无法使其工作C#:
public delegate int tCallBackFunc(int Param);
...
tCallBackFunc cb; //I will initialize it when it is compiled
MyCOMObject.MyFunc(cb); //cannot find any way to cast cb to "ref int"
Run Code Online (Sandbox Code Playgroud)
看来我使用了错误的方法,有没有一种快速的方法将函数指针声明为C++中COM对象方法的参数,然后在C#中使用它?