[Insight-developers] Rounding functions in itkMacro.h
Tom Vercauteren
tom.vercauteren at m4x.org
Tue May 12 17:30:34 EDT 2009
Oups, in my previous email
"I see that vnl_math.h is only included if ITK_USE_PORTABLE_ROUND is ON."
should have been
"I see that vnl_math.h is only included if ITK_USE_PORTABLE_ROUND is
OFF or not defined."
Tom
On Tue, May 12, 2009 at 23:26, Tom Vercauteren <tom.vercauteren at m4x.org> wrote:
> Hi Luis,
>
> I think I got the culprit. It didn't make sense to me how
> vnl_math_rnd_halfintup could be undeclared. I am using ubuntu 9.04
> with gcc 4.3 and every thing works out fine. Se for example this debug
> build with sse2 rounding:
> http://www.cdash.org/CDash/buildSummary.php?buildid=331407
> http://www.cdash.org/CDash/testDetails.php?test=22870870&build=331407
>
> The only possible reason for a mising vnl_math_rnd_halfintup is a
> missing or outdated vnl_math.h. Looking back at the code
> http://public.kitware.com/cgi-bin/viewcvs.cgi/Code/Common/itkMacro.h?root=Insight&view=markup
> I see that vnl_math.h is only included if ITK_USE_PORTABLE_ROUND is
> ON. I wasn't using this variable...
>
> Could you please try and recompile by changing
> #ifndef ITK_USE_PORTABLE_ROUND
> #include "vnl/vnl_math.h"
> #endif
> by
> #include "vnl/vnl_math.h"
> in
> itkMacro.h
> ?
>
> Sorry for not giving you a patch but I don't have a development machine at hand.
>
> Also, I saw from your previous email that you had set
> VNL_CONFIG_ENABLE_SSE2 to ON. This is not used by the sse2 rounding
> functions which only relies on VNL_CONFIG_ENABLE_SSE2_ROUNDING. Since
> VXL developers aresaying that VNL_CONFIG_ENABLE_SSE2 is unstable, I
> wouldn't recommend turning this option on.
>
> Hope this helps,
> Tom
>
>
> On Tue, May 12, 2009 at 18:14, Luis Ibanez <luis.ibanez at kitware.com> wrote:
>> 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