[Insight-developers] Rounding functions in itkMacro.h

Tom Vercauteren tom.vercauteren at m4x.org
Tue May 12 06:43:58 EDT 2009


Hi Luis,

I have almost the same system so this will ease the process.

The problem is indeed related to the -msse2 flag. Running
  cmake -DCMAKE_C_FLAGS="-msse2" -DCMAKE_CXX_FLAGS="-msse2"
-DVNL_CONFIG_ENABLE_SSE2_ROUNDING=ON <path_to_itk>
works correctly.

So it looks like the cmake magic used by vxl to detect and add sse2
support is wrong. Actually running
  cmake -DVNL_CONFIG_ENABLE_SSE2_ROUNDING=ON <path_to_itk>
leads to a cmake error.

This is not specific to the patched itk version as the same behavior
is observed on a pristine checkout of the vxl svn trunk.

There are at least two errors I can see from the cmake scripts in vxl
svn trunk when VNL_CONFIG_ENABLE_SSE2_ROUNDING is ON.

1)  ADD_DEFINITIONS( -msse2 ) is called after vxl tries to detect
whether it has sse2 support. However this flag is required for gcc
(4.3) to find emmintrin.h and use the sse2 intrinsics.

2) Even if ADD_DEFINITIONS( -msse2 ) was called prior to
  PERFORM_CHECK_HEADER(emmintrin.h VXL_HAS_EMMINTRIN_H)
and
  PERFORM_CMAKE_TEST_RUN(vxl_platform_tests.cxx VXL_HAS_SSE2_HARDWARE_SUPPORT)
it wouldn't make a difference since PERFORM_CHECK_HEADER and
PERFORM_CMAKE_TEST_RUN do not rely on such ADD_DEFINITIONS.

I am not sure how to fix this right now as I am not a cmake expert.
Any help would be appreciated.


Note this this issue does not affect the case when
VNL_CONFIG_ENABLE_SSE2_ROUNDING is OFF. In such a case, on your
system, the implementation will fallback to the gcc assembly calls,
e.g.
  inline int vnl_math_rnd_halfinttoeven(float  x) { int r; __asm__
__volatile__ ("fistpl %0" : "=m"(r) : "t"(x) : "st"); return r; }

I'll report back if I find a patch for the cmake scripts that I find reasonable.

Tom

On Tue, May 12, 2009 at 04:27, Luis Ibanez <luis.ibanez at kitware.com> wrote:
> Hi Tom,
>
> I'm testing this on a Laptop:
>
>    Linux Ubuntu 8.10
>    gcc 4.3.2
>    Intel(R) Core(TM)2 Duo CPU     T9600  @ 2.80GHz
>
>
> The error was a link error.
> Missing symbols.
>
> lshw returns the following data from the CPU:
>
>  *-cpu
>          description: CPU
>          product: Intel(R) Core(TM)2 Duo CPU     T9600  @ 2.80GHz
>          vendor: Intel Corp.
>          physical id: 400
>          bus info: cpu at 0
>          version: 6.7.6
>          slot: Microprocessor
>          size: 2801MHz
>          capacity: 2801MHz
>          width: 64 bits
>          clock: 266MHz
>          capabilities: fpu fpu_exception wp vme de pse tsc msr pae
> mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr
> sse sse2 ss ht tm pbe nx x86-64 constant_tsc arch_perfmon pebs bts pni
> monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr sse4_1 lahf_lm cpufreq
>          configuration: id=0
>
> --
>
>      Luis
>
>
> ------------------------------
> On Mon, May 11, 2009 at 7:16 PM, Tom Vercauteren
> <tom.vercauteren at m4x.org> wrote:
>> Luis,
>>
>> Can you provide some information on your configuration (OS, compiler,
>> cpu)? Also did you get a compilation error or a link error?
>>
>> One potential thing to look at is whether your machine actually
>> supports sse2 and whether vxl correctly detects it. It looks like I
>> missed a patch to the sse2 detection in the list I gave you:
>> http://vxl.svn.sourceforge.net/viewvc/vxl/trunk/config/cmake/config/CMakeLists.txt?r1=23457&r2=23456&pathrev=23457
>> http://vxl.svn.sourceforge.net/viewvc/vxl/trunk/config/cmake/config/vxl_platform_tests.cxx?r1=23457&r2=23456&pathrev=23457
>>
>> No matter this patch, setting  VNL_CONFIG_ENABLE_SSE2_ROUNDING to OFF
>> should definitely not remove the declarations of the new rounding
>> methods. It should simply fallback to another implementation than the
>> SSE2 one (gcc-specific or msvc-specific or vanilla c).
>>
>> Since I don't have access to my computer right now, it's a bit
>> difficult for me to provide you more information right now.
>>
>> Tom
>>
>> On Tue, May 12, 2009 at 00:44, Luis Ibanez <luis.ibanez at kitware.com> wrote:
>>> Hi Tom,
>>>
>>> Setting  VNL_CONFIG_ENABLE_SSE2_ROUNDING to OFF
>>> removes the declarations of the new rounding methods in
>>> vnl_math.h.
>>>
>>> I'm probably doing something wrong here.
>>>
>>> I have generated a patch with the changes and uploaded it
>>> to the bug tracker:
>>>
>>> You will find it in:
>>>    http://public.kitware.com/Bug/view.php?id=6558
>>>
>>> is the patch named:
>>>
>>>          PortableRound-May-11-2009.patch
>>>
>>>
>>> If you have a chance,
>>> could you help me find out what I'm missing ?
>>>
>>>
>>>      Thanks
>>>
>>>
>>>            Luis
>>>
>


More information about the Insight-developers mailing list