[Insight-developers] Rounding functions in itkMacro.h

Tom Vercauteren tom.vercauteren at m4x.org
Tue May 12 08:48:36 EDT 2009


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