使用 __m64 引用将 C++ 项目转换为 x64
Converting a C++ project to x64 with __m64 references
因此,当我开始转换并将目标设置为 '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
所以我尝试更深入地调查这些,我发现它不喜欢头文件中的 __m64:特别是 mmintrin.h(可能还有其他)。在我使用 C++ 的业余时间里,因为我已经多年没有弄乱这门语言(我通常在 C# 部门),所以我尝试编辑头文件,并将 __m64 替换为 [=24= 】 ??!!。不知道什么是正确的路线,让这个和其他 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);
...
来自 __m64
类型文档:
The __m64 data type is not supported on x64 processors. Applications that use __m64 as part of MMX intrinsics must be rewritten to use equivalent SSE and SSE2 intrinsics.
http://msdn.microsoft.com/en-us/library/08x3t697(v=vs.110).aspx
所以看起来你有三个选择:坚持使用 32 位,将 MMX 内在函数移植到 SSE,或者回退到非 SIMD 实现(如果你有一个 - 如果没有,那么考虑在标量中重新实现代码)。
因此,当我开始转换并将目标设置为 '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
所以我尝试更深入地调查这些,我发现它不喜欢头文件中的 __m64:特别是 mmintrin.h(可能还有其他)。在我使用 C++ 的业余时间里,因为我已经多年没有弄乱这门语言(我通常在 C# 部门),所以我尝试编辑头文件,并将 __m64 替换为 [=24= 】 ??!!。不知道什么是正确的路线,让这个和其他 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);
...
来自 __m64
类型文档:
The __m64 data type is not supported on x64 processors. Applications that use __m64 as part of MMX intrinsics must be rewritten to use equivalent SSE and SSE2 intrinsics.
http://msdn.microsoft.com/en-us/library/08x3t697(v=vs.110).aspx
所以看起来你有三个选择:坚持使用 32 位,将 MMX 内在函数移植到 SSE,或者回退到非 SIMD 实现(如果你有一个 - 如果没有,那么考虑在标量中重新实现代码)。