Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 转换C++;项目到x64,带有_m64参考_C++_Visual C++_X86_64 Bit_Mmx - Fatal编程技术网

C++ 转换C++;项目到x64,带有_m64参考

C++ 转换C++;项目到x64,带有_m64参考,c++,visual-c++,x86,64-bit,mmx,C++,Visual C++,X86,64 Bit,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 CONVOLUTIO

因此,当我开始转换并将目标设置为“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系),我尝试编辑头文件,用Y.M128i!!不知道什么是正确的路径,以使此DLL和其他DLL针对MachineX64进行编译。在编辑并将标题的源代码放入本地目录后,它仍然不允许我通过右键单击进行编译。。。又是业余时间。 有几个人问过类似的问题,但我找不到适合我的

下面是一个带有不受支持的_m64的“mmintrin.h”示例

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);
...

\uuu m64
类型文档中:

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


因此,您似乎有三种选择:坚持32位,将MMX内部的端口发送到SSE,或者回落到非SIMD实现(如果您有一个-如果没有,那么考虑在标量代码中重新实现)。< /P>您得到了2个未解决的外部或7?7?RobertKoernke:内部函数在非常低的抽象级别上运行——不存在为所有MMX操作提供精确等价物的映射。你知道,更高抽象级别<代码> ValSux<代码>现在是否在C++中被标准化了?任何内在的使用<代码>因此,不推荐使用x64本机。希望代码库有一个C++实现的内部函数优化的函数,你可以回落,但无论哪种方式,你必须重新实现MMX作为SSE是便携式的。好消息是,一旦您这样做,它仍然可以为x86和x64本机构建。从某种意义上讲,它是可移植的,相同的SSE内部函数将为x86和x64本机编译(即,您不需要为x86和x64本机维护不同的代码路径)。如今,SSE/SSE2支持无处不在。这些事实被大量用于研究。显然,它们不会为其他体系结构(如ARM或PPC)编译,因此intrinsics优化的代码应该有一个标准的C/C++代码路径作为备用路径,以提高可移植性。@RobertKoernke:使用一个可以编译使用MMX的64位代码的编译器(使用intrinsics)。例如,gcc对
#include void emms(void){{mu m_empty();}没有问题
说MMX在64位Windows应用程序中可用。所以,如果你有问题,那是你的编译器的错。有时将MMX代码移植到SSE是很容易的,甚至会加速。其他时候,这意味着您必须调整调用代码以并行执行两个8x8 SAD或其他操作。(例如ffmpeg的
mpdecimate
filter)@RobertKoernke:用你目前掌握的代码问一个新问题。未对齐上的SSE内存访问错误,除非使用未对齐的加载内部函数(
\u mm\u loadu\u si128
)。AVX恢复该决定,并允许未对齐的地址,对齐的加载/存储内部函数除外。我仍然感到惊讶的是,在使用VisualC++的项目中,没有一种合理的方法来编译MMX本质。也许你可以用GCC或CLAN编译你的MMX代码,并把它链接到你的Visual C++项目中去?你会怀疑的。由于名称不同,需要
extern“C”
函数。