[Insight-developers] Rounding functions in itkMacro.h

Luis Ibanez luis.ibanez at kitware.com
Tue May 12 12:14:21 EDT 2009


HI Tom,

Thanks for the new patch.

Unfortunately it is not compiling for me.


Here is what I got:


[ 41%] Building CXX object Code/Common/CMakeFiles/ITKCommon.dir/itkBarrier.o
In file included from /home/ibanez/src/Insight/Code/Common/itkTimeStamp.h:23,
                 from /home/ibanez/src/Insight/Code/Common/itkLightObject.h:21,
                 from /home/ibanez/src/Insight/Code/Common/itkBarrier.h:20,
                 from /home/ibanez/src/Insight/Code/Common/itkBarrier.cxx:17:
/home/ibanez/src/Insight/Code/Common/itkMacro.h: In function ‘int
itk::Math::RoundHalfIntegerUp(float)’:
/home/ibanez/src/Insight/Code/Common/itkMacro.h:979: error:
‘vnl_math_rnd_halfintup’ was not declared in this scope
/home/ibanez/src/Insight/Code/Common/itkMacro.h: In function ‘int
itk::Math::RoundHalfIntegerUp(double)’:
/home/ibanez/src/Insight/Code/Common/itkMacro.h:980: error:
‘vnl_math_rnd_halfintup’ was not declared in this scope
/home/ibanez/src/Insight/Code/Common/itkMacro.h: In function ‘int
itk::Math::RoundHalfIntegerToEven(float)’:
/home/ibanez/src/Insight/Code/Common/itkMacro.h:981: error:
‘vnl_math_rnd_halfinttoeven’ was not declared in this scope
/home/ibanez/src/Insight/Code/Common/itkMacro.h: In function ‘int
itk::Math::RoundHalfIntegerToEven(double)’:
/home/ibanez/src/Insight/Code/Common/itkMacro.h:982: error:
‘vnl_math_rnd_halfinttoeven’ was not declared in this scope
make[2]: *** [Code/Common/CMakeFiles/ITKCommon.dir/itkBarrier.o] Error 1
make[1]: *** [Code/Common/CMakeFiles/ITKCommon.dir/all] Error 2



and the SSE flags in my build are ON

 grep ENABLE_SSE MakeCache.txt

VNL_CONFIG_ENABLE_SSE2:BOOL=ON
VNL_CONFIG_ENABLE_SSE2_ROUNDING:BOOL=ON
//Advanced flag for variable: VNL_CONFIG_ENABLE_SSE2
VNL_CONFIG_ENABLE_SSE2-ADVANCED:INTERNAL=1
//Modified flag for variable: VNL_CONFIG_ENABLE_SSE2
VNL_CONFIG_ENABLE_SSE2-MODIFIED:INTERNAL=1
//Advanced flag for variable: VNL_CONFIG_ENABLE_SSE2_ROUNDING
VNL_CONFIG_ENABLE_SSE2_ROUNDING-ADVANCED:INTERNAL=1
//Modified flag for variable: VNL_CONFIG_ENABLE_SSE2_ROUNDING
VNL_CONFIG_ENABLE_SSE2_ROUNDING-MODIFIED:INTERNAL=1


BTW: This is a Debug build in gcc 4.3.2, Linux Ubuntu 8.10.


      Luis


=========================================
On Tue, May 12, 2009 at 8:48 AM, Tom Vercauteren
<tom.vercauteren at m4x.org> wrote:
> Luis,
>
> I have put an updated patch on the bug tracker:
> http://public.kitware.com/Bug/file_download.php?file_id=2236&type=bug
>
> In addition to the changes I mentioned earlier, it includes some small
> modifications to some CMakeLists.txt in order to ease turning on SSE2
> rounding.
>  cmake -DVNL_CONFIG_ENABLE_SSE2_ROUNDING=ON <path_to_itk>
> and
>  ccmake <path_to_itk>
>  switch VNL_CONFIG_ENABLE_SSE2_ROUNDING to on
> now also works with gcc
>
> Let me know if it works for you.
>
> Tom
>
> On Tue, May 12, 2009 at 12:43, Tom Vercauteren <tom.vercauteren at m4x.org> wrote:
>> 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