ITK icon indicating copy to clipboard operation
ITK copied to clipboard

Compilation fails on 32-bit: target specific option mismatch

Open badshah400 opened this issue 4 years ago • 6 comments

Description

Compilation fails on i586 — and possibly other 32 bit architectures — with the following error:

[  201s] In file included from ../Modules/Core/Common/include/itkMath.h:32,
[  201s]                  from ../Modules/Core/Common/include/itkVector.hxx:21,
[  201s]                  from ../Modules/Core/Common/include/itkVector.h:332,
[  201s]                  from ../Modules/Core/Common/include/itkPoint.h:23,
[  201s]                  from ../Modules/Core/Common/include/itkContinuousIndex.h:21,
[  201s]                  from ../Modules/Core/Common/include/itkImageRegion.h:34,
[  201s]                  from ../Modules/Core/Common/include/itkImageRegionSplitterBase.h:21,
[  201s]                  from ../Modules/Core/Common/include/itkImageRegionSplitterSlowDimension.h:21,
[  201s]                  from ../Modules/Core/Common/src/itkImageRegionSplitterSlowDimension.cxx:19:
[  201s] ../Modules/Core/Common/include/itkMathDetail.h: In function 'itk::int32_t itk::Math::Detail::RoundHalfIntegerToEven_32(double)':
[  201s] ../Modules/Core/Common/include/itkMathDetail.h:151:24: warning: SSE vector return without SSE enabled changes the ABI [-Wpsabi]
[  201s]   151 |   return _mm_cvtsd_si32(_mm_set_sd(x));
[  201s]       |          ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~
[  201s] In file included from ../Modules/Core/Common/include/itkMathDetail.h:37,
[  201s]                  from ../Modules/Core/Common/include/itkMath.h:32,
[  201s]                  from ../Modules/Core/Common/include/itkVector.hxx:21,
[  201s]                  from ../Modules/Core/Common/include/itkVector.h:332,
[  201s]                  from ../Modules/Core/Common/include/itkPoint.h:23,
[  201s]                  from ../Modules/Core/Common/include/itkContinuousIndex.h:21,
[  201s]                  from ../Modules/Core/Common/include/itkImageRegion.h:34,
[  201s]                  from ../Modules/Core/Common/include/itkImageRegionSplitterBase.h:21,
[  201s]                  from ../Modules/Core/Common/include/itkImageRegionSplitterSlowDimension.h:21,
[  201s]                  from ../Modules/Core/Common/src/itkImageRegionSplitterSlowDimension.cxx:19:
[  201s] /usr/lib/gcc/i586-suse-linux/10/include/emmintrin.h:842:1: error: inlining failed in call to 'always_inline' '_mm_cvtsd_si32(double __vector(2))': target specific option mismatch
[  201s]   842 | _mm_cvtsd_si32 (__m128d __A)
[  201s]       | ^~~~~~~~~~~~~~
[  201s] In file included from ../Modules/Core/Common/include/itkMath.h:32,
[  201s]                  from ../Modules/Core/Common/include/itkVector.hxx:21,
[  201s]                  from ../Modules/Core/Common/include/itkVector.h:332,
[  202s]                  from ../Modules/Core/Common/include/itkPoint.h:23,
[  202s]                  from ../Modules/Core/Common/include/itkContinuousIndex.h:21,
[  202s]                  from ../Modules/Core/Common/include/itkImageRegion.h:34,
[  202s]                  from ../Modules/Core/Common/include/itkImageRegionSplitterBase.h:21,
[  202s]                  from ../Modules/Core/Common/include/itkImageRegionSplitterSlowDimension.h:21,
[  202s]                  from ../Modules/Core/Common/src/itkImageRegionSplitterSlowDimension.cxx:19:
[  202s] ../Modules/Core/Common/include/itkMathDetail.h:151:24: note: called from here
[  202s]   151 |   return _mm_cvtsd_si32(_mm_set_sd(x));
[  202s]       |          ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~
[  202s] In file included from ../Modules/Core/Common/include/itkMathDetail.h:37,
[  202s]                  from ../Modules/Core/Common/include/itkMath.h:32,
[  202s]                  from ../Modules/Core/Common/include/itkVector.hxx:21,
[  202s]                  from ../Modules/Core/Common/include/itkVector.h:332,
[  202s]                  from ../Modules/Core/Common/include/itkPoint.h:23,
[  202s]                  from ../Modules/Core/Common/include/itkContinuousIndex.h:21,
[  202s]                  from ../Modules/Core/Common/include/itkImageRegion.h:34,
[  202s]                  from ../Modules/Core/Common/include/itkImageRegionSplitterBase.h:21,
[  202s]                  from ../Modules/Core/Common/include/itkImageRegionSplitterSlowDimension.h:21,
[  202s]                  from ../Modules/Core/Common/src/itkImageRegionSplitterSlowDimension.cxx:19:
[  202s] /usr/lib/gcc/i586-suse-linux/10/include/emmintrin.h:66:1: error: inlining failed in call to 'always_inline' '_mm_set_sd(double)': target specific option mismatch

and on and on. No issues when building on x86_64, however. Also wasn't an issue with the previous version 5.1.2. Full log attached: _log.zip

Reproducibility

Every time on i586.

Versions

ITK version 5.2.0.

Environment

  • CMake: 3.20.1
  • Python: 3.8.9
  • GCC 10.3.0
  • OS: openSUSE Tumbleweed (Linux)

badshah400 avatar May 11 '21 12:05 badshah400

32-bit compilation on Visual Studio 2019 works. Maybe someone with a similar environment to yours should try to reproduce.

dzenanz avatar May 11 '21 13:05 dzenanz

This may be simply because of how gcc handles SSE instruction sets on 32-bit. From the GCC manual:

For the x86-32 compiler, you must use -march=cpu-type, -msse or -msse2 switches to enable SSE extensions and make this option effective. For the x86-64 compiler, these extensions are enabled by default.

badshah400 avatar May 11 '21 14:05 badshah400

On manually adding -msse2 to the compiler flags solves the above complaint, but trades in a new one:

[  306s] FAILED: Modules/Core/Common/src/CMakeFiles/ITKCommon.dir/itkMemoryProbesCollectorBase.cxx.o 
[  306s] /usr/bin/c++ -DITKCommon_EXPORTS -I../Modules/ThirdParty/DoubleConversion/src -IModules/ThirdParty/DoubleConversion/src/double-conversion -IModules/ThirdParty/Eigen3/src -IModules/ThirdParty/KWIML/src -I../Modules/ThirdParty/KWIML/src -IModules/ThirdParty/KWSys/src -I../Modules/ThirdParty/VNL/src/vxl/v3p/netlib -I../Modules/ThirdParty/VNL/src/vxl/vcl -I../Modules/ThirdParty/VNL/src/vxl/core -IModules/ThirdParty/VNL/src/vxl/v3p/netlib -IModules/ThirdParty/VNL/src/vxl/vcl -IModules/ThirdParty/VNL/src/vxl/core -IModules/Core/Common -I../Modules/Core/Common/include -I../Modules/ThirdParty/VNL/src/vxl/core/vnl/algo -I../Modules/ThirdParty/VNL/src/vxl/core/vnl -IModules/ThirdParty/VNL/src/vxl/core/vnl -isystem /usr/include/eigen3 -msse2 -DNDEBUG -Wall -Wcast-align -Wdisabled-optimization -Wextra -Wformat=2 -Winvalid-pch -Wno-format-nonliteral -Wpointer-arith -Wshadow -Wunused -Wwrite-strings -funit-at-a-time -Wno-strict-overflow -Wno-deprecated -Wno-invalid-offsetof -Woverloaded-virtual -Wstrict-null-sentinel  -O2 -g -DNDEBUG -fPIC -std=c++11 -MD -MT Modules/Core/Common/src/CMakeFiles/ITKCommon.dir/itkMemoryProbesCollectorBase.cxx.o -MF Modules/Core/Common/src/CMakeFiles/ITKCommon.dir/itkMemoryProbesCollectorBase.cxx.o.d -o Modules/Core/Common/src/CMakeFiles/ITKCommon.dir/itkMemoryProbesCollectorBase.cxx.o -c ../Modules/Core/Common/src/itkMemoryProbesCollectorBase.cxx
[  306s] In file included from ../Modules/Core/Common/include/itkMath.h:32,
[  306s]                  from ../Modules/Core/Common/include/itkResourceProbe.hxx:41,
[  306s]                  from ../Modules/Core/Common/include/itkResourceProbe.h:205,
[  306s]                  from ../Modules/Core/Common/include/itkMemoryProbe.h:21,
[  306s]                  from ../Modules/Core/Common/include/itkMemoryProbesCollectorBase.h:22,
[  306s]                  from ../Modules/Core/Common/src/itkMemoryProbesCollectorBase.cxx:18:
[  306s] ../Modules/Core/Common/include/itkMathDetail.h: In function 'itk::int64_t itk::Math::Detail::RoundHalfIntegerToEven_64(double)':
[  306s] ../Modules/Core/Common/include/itkMathDetail.h:317:10: error: '_mm_cvtsd_si64' was not declared in this scope; did you mean '_mm_cvtsd_si32'?
[  306s]   317 |   return _mm_cvtsd_si64(_mm_set_sd(x));
[  306s]       |          ^~~~~~~~~~~~~~
[  306s]       |          _mm_cvtsd_si32
[  306s] ../Modules/Core/Common/include/itkMathDetail.h: In function 'itk::int64_t itk::Math::Detail::RoundHalfIntegerToEven_64(float)':
[  306s] ../Modules/Core/Common/include/itkMathDetail.h:326:10: error: '_mm_cvtss_si64' was not declared in this scope; did you mean '_mm_cvtss_si32'?
[  306s]   326 |   return _mm_cvtss_si64(_mm_set_ss(x));
[  306s]       |          ^~~~~~~~~~~~~~
[  306s]       |          _mm_cvtss_si32

badshah400 avatar May 11 '21 14:05 badshah400

This condition may need to be refined:

https://github.com/InsightSoftwareConsortium/ITK/blob/047fa6934ac32711d1d7b84fa6eb81c72db01960/Modules/Core/Common/src/itkConfigure.h.in#L186-L188

thewtex avatar Jun 09 '21 14:06 thewtex

I had the same error using mingw32. (without using -msse2)

On manually adding -msse2 to the compiler flags solves the above complaint, but trades in a new one:

[  306s] FAILED: Modules/Core/Common/src/CMakeFiles/ITKCommon.dir/itkMemoryProbesCollectorBase.cxx.o 
[  306s] /usr/bin/c++ -DITKCommon_EXPORTS -I../Modules/ThirdParty/DoubleConversion/src -IModules/ThirdParty/DoubleConversion/src/double-conversion -IModules/ThirdParty/Eigen3/src -IModules/ThirdParty/KWIML/src -I../Modules/ThirdParty/KWIML/src -IModules/ThirdParty/KWSys/src -I../Modules/ThirdParty/VNL/src/vxl/v3p/netlib -I../Modules/ThirdParty/VNL/src/vxl/vcl -I../Modules/ThirdParty/VNL/src/vxl/core -IModules/ThirdParty/VNL/src/vxl/v3p/netlib -IModules/ThirdParty/VNL/src/vxl/vcl -IModules/ThirdParty/VNL/src/vxl/core -IModules/Core/Common -I../Modules/Core/Common/include -I../Modules/ThirdParty/VNL/src/vxl/core/vnl/algo -I../Modules/ThirdParty/VNL/src/vxl/core/vnl -IModules/ThirdParty/VNL/src/vxl/core/vnl -isystem /usr/include/eigen3 -msse2 -DNDEBUG -Wall -Wcast-align -Wdisabled-optimization -Wextra -Wformat=2 -Winvalid-pch -Wno-format-nonliteral -Wpointer-arith -Wshadow -Wunused -Wwrite-strings -funit-at-a-time -Wno-strict-overflow -Wno-deprecated -Wno-invalid-offsetof -Woverloaded-virtual -Wstrict-null-sentinel  -O2 -g -DNDEBUG -fPIC -std=c++11 -MD -MT Modules/Core/Common/src/CMakeFiles/ITKCommon.dir/itkMemoryProbesCollectorBase.cxx.o -MF Modules/Core/Common/src/CMakeFiles/ITKCommon.dir/itkMemoryProbesCollectorBase.cxx.o.d -o Modules/Core/Common/src/CMakeFiles/ITKCommon.dir/itkMemoryProbesCollectorBase.cxx.o -c ../Modules/Core/Common/src/itkMemoryProbesCollectorBase.cxx
[  306s] In file included from ../Modules/Core/Common/include/itkMath.h:32,
[  306s]                  from ../Modules/Core/Common/include/itkResourceProbe.hxx:41,
[  306s]                  from ../Modules/Core/Common/include/itkResourceProbe.h:205,
[  306s]                  from ../Modules/Core/Common/include/itkMemoryProbe.h:21,
[  306s]                  from ../Modules/Core/Common/include/itkMemoryProbesCollectorBase.h:22,
[  306s]                  from ../Modules/Core/Common/src/itkMemoryProbesCollectorBase.cxx:18:
[  306s] ../Modules/Core/Common/include/itkMathDetail.h: In function 'itk::int64_t itk::Math::Detail::RoundHalfIntegerToEven_64(double)':
[  306s] ../Modules/Core/Common/include/itkMathDetail.h:317:10: error: '_mm_cvtsd_si64' was not declared in this scope; did you mean '_mm_cvtsd_si32'?
[  306s]   317 |   return _mm_cvtsd_si64(_mm_set_sd(x));
[  306s]       |          ^~~~~~~~~~~~~~
[  306s]       |          _mm_cvtsd_si32
[  306s] ../Modules/Core/Common/include/itkMathDetail.h: In function 'itk::int64_t itk::Math::Detail::RoundHalfIntegerToEven_64(float)':
[  306s] ../Modules/Core/Common/include/itkMathDetail.h:326:10: error: '_mm_cvtss_si64' was not declared in this scope; did you mean '_mm_cvtss_si32'?
[  306s]   326 |   return _mm_cvtss_si64(_mm_set_ss(x));
[  306s]       |          ^~~~~~~~~~~~~~
[  306s]       |          _mm_cvtss_si32

After commenting out the quoted define, everything compiled without erros!

This condition may need to be refined:

https://github.com/InsightSoftwareConsortium/ITK/blob/047fa6934ac32711d1d7b84fa6eb81c72db01960/Modules/Core/Common/src/itkConfigure.h.in#L186-L188

glatzan avatar Oct 04 '21 09:10 glatzan

This issue has been automatically marked as stale because it has not had recent activity. Thank you for your contributions.

stale[bot] avatar Apr 16 '22 10:04 stale[bot]