小编Mik*_*ike的帖子

使用AVX CPU指令:没有"/ arch:AVX"的性能不佳

我的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而言,由于某些原因它不起作用.

c++ performance sse visual-studio-2010 avx

49
推荐指数
2
解决办法
3万
查看次数

WPF中的ContextMenu

我是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中有可能吗?

c# wpf contextmenu

13
推荐指数
2
解决办法
5万
查看次数

VS2010 SP1是否仅支持部分AVX指令集?

微软表示VS2010支持全套AVX指令:

http://blogs.msdn.com/b/vcblog/archive/2009/11/02/visual-c-code-generation-in-visual-studio-2010.aspx

...在VS2010版本中,所有AVX功能和指令都通过内在和完全支持/arch:AVX....

但是我找不到任何用于融合乘法运算的内在函数

http://software.intel.com/sites/products/documentation/studio/composer/en-us/2011/compiler_c/intref_cls/common/intref_bk_avx_fma.htm#intref_bk_avx_fma

我需要使用_mm256_fmadd_ps函数,但它在"immintrin.h"标题中缺失.我真的很困惑.

c++ sse visual-studio-2010 avx fma

3
推荐指数
1
解决办法
1596
查看次数

函数指针作为COM方法的参数

我用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#中使用它?

c# c++ com

0
推荐指数
1
解决办法
429
查看次数

标签 统计

c++ ×3

avx ×2

c# ×2

sse ×2

visual-studio-2010 ×2

com ×1

contextmenu ×1

fma ×1

performance ×1

wpf ×1