使用__m64引用将C++项目转换为x64

Rob*_*nke 10 c++ 64-bit x86 visual-c++ mmx

因此,当我开始转换并将目标设置为'x64'时,我得到7个未解析的外部.两个例子:

error LNK2001: unresolved external symbol _m_empty    ...CONVOLUTION_2D_USHORT.obj  CONVOLUTION_2D_USHORT
error LNK2001: unresolved external symbol _mm_setzero_si64  ...CONVOLUTION_2D_USHORT.obj    CONVOLUTION_2D_USHORT
Run Code Online (Sandbox Code Playgroud)

所以我试着更深入地研究这些,我发现它不喜欢头文件中的__m64:特别是mmintrin.h(可能还有其他的).在我使用C++的业余时间,因为我多年来没有弄乱语言,(我通常在C#部门),我试图编辑头文件,并用__m128i替换__m64 !! !! 不知道什么是正确的路由,让这个和其他DLL编译对MachineX64.编辑并将标题源放在我的本地目录后,它仍然不允许我通过右键单击...再次 - 业余小时编译.有几个人问过类似的问题,但我找不到合适的问题.

以下是'mmintrin.h'的示例,其中包含不受支持的__m64 ...

typedef union __declspec(intrin_type)_CRT_ALIGN(8) __m64
{
unsigned __int64    m64_u64;
float               m64_f32[2];
__int8              m64_i8[8];
__int16             m64_i16[4];
__int32             m64_i32[2];
__int64             m64_i64;
unsigned __int8     m64_u8[8];
unsigned __int16    m64_u16[4];
unsigned __int32    m64_u32[2];
} __m64;

/* General support intrinsics */
void  _m_empty(void);
__m64 _m_from_int(int _I);
int   _m_to_int(__m64 _M);
__m64 _m_packsswb(__m64 _MM1, __m64 _MM2);
__m64 _m_packssdw(__m64 _MM1, __m64 _MM2);
__m64 _m_packuswb(__m64 _MM1, __m64 _MM2);
__m64 _m_punpckhbw(__m64 _MM1, __m64 _MM2);
__m64 _m_punpckhwd(__m64 _MM1, __m64 _MM2);
__m64 _m_punpckhdq(__m64 _MM1, __m64 _MM2);
__m64 _m_punpcklbw(__m64 _MM1, __m64 _MM2);
__m64 _m_punpcklwd(__m64 _MM1, __m64 _MM2);
__m64 _m_punpckldq(__m64 _MM1, __m64 _MM2);
...
Run Code Online (Sandbox Code Playgroud)

Pau*_*l R 10

__m64类型文档:

x64处理器不支持__m64数据类型.必须重写使用__m64作为MMX内在函数的一部分的应用程序,以使用等效的SSE和SSE2内在函数.

http://msdn.microsoft.com/en-us/library/08x3t697(v=vs.110).aspx

所以看起来你有三个选择:坚持使用32位,将MMX内在函数移植到SSE,或者回退到非SIMD实现(如果你有一个 - 如果不是,那么考虑在标量代码中重新实现).

  • @RobertKoernke:使用可编译使用MMX(带内在函数)的64位代码的编译器.例如,gcc没有问题`#include <mmintrin.h> void emms(void){_ m_empty(); } http://www.virtualdub.org/blog/pivot/entry.php?id=107表示MMX可用于64位Windows应用程序.因此,如果您遇到问题,那就是编译器的错误.有时将MMX代码移植到SSE很容易,甚至可以提高速度.其他时候,这意味着你必须调整调用代码来并行执行两个8x8 SAD.(例如ffmpeg的`mpdecimate`过滤器) (2认同)
  • @RobertKoernke:用你目前的代码提出一个新问题.SSE内存访问故障未对齐,除非您使用其中一个未对齐的加载内在函数(`_mm_loadu_si128`).AVX恢复该决定,并允许未对齐的地址,除了对齐的加载/存储内在函数.我仍然感到惊讶的是,在使用Visual C++的项目中没有合理的方法来编译MMX内在函数.也许你可以使用gcc或clang编译你的MMX代码,并将其链接到你的Visual C++项目?你有疑问.需要`extern"C"`函数,因为不同的名称修改. (2认同)