[Insight-users] Error in vnl_sse template specializations (and fix)

Shashwath T.R. trshash at gmail.com
Tue May 31 03:34:40 EDT 2011


Hi Luis,

I tried it again today, with a current checkout (commit hash
6ebd49640341277bdc6fc3c3ce77f85eb3150026) on Windows, using Visual Studio
2008. I can try with GCC on Linux too, though I don't think this is
platform-dependent.

This problem exists here too. I have VNL_CONFIG_ENABLE_SSE2:BOOL=ON and
VNL_CONFIG_ENABLE_SSE2_ROUNDING:BOOL=ON.

I don't think the rest of the config flags mean anything. There are explicit
template specializations of vnl_sse<T> that are enabled when
VNL_CONFIG_ENABLE_SSE2 is on (#if VNL_CONFIG_ENABLE_SSE2). If I turn it off,
it works correctly. Interestingly, vnl_sse doesn't seem dependent on this
variable. Only the float and double specializations are enabled/disabled
using this flag.

For now, I'm just turning SSE2 off.

Thanks,
Shash

On Sun, May 22, 2011 at 12:55 AM, Luis Ibanez <luis.ibanez at kitware.com>wrote:

> Hi Shashwath
>
> 1) How recent is your checkout of ITK ?
>
> 2) Did you purposely enabled any SSE options,
>     when configuring with CMake ?
>
> 3) Here are the SSE related flag in my working
>    build of ITK on Linux:
>
> CMakeCache.txt:VNL_CONFIG_ENABLE_SSE2:BOOL=OFF
> CMakeCache.txt:VNL_CONFIG_ENABLE_SSE2_ROUNDING:BOOL=ON
> CMakeCache.txt://Have include HAVE_ASSERT_H
> CMakeCache.txt:HAVE_ASSERT_H:INTERNAL=1
> CMakeCache.txt://Test ITK_COMPILER_DOES_NOT_NEED_MSSE2_FLAG
> CMakeCache.txt:ITK_COMPILER_DOES_NOT_NEED_MSSE2_FLAG:INTERNAL=1
> CMakeCache.txt://Test ITK_COMPILER_SUPPORTS_SSE2_32
> CMakeCache.txt:ITK_COMPILER_SUPPORTS_SSE2_32:INTERNAL=1
> CMakeCache.txt://Test ITK_COMPILER_SUPPORTS_SSE2_64
> CMakeCache.txt:ITK_COMPILER_SUPPORTS_SSE2_64:INTERNAL=1
> CMakeCache.txt:VCL_CXX_HAS_HEADER_CASSERT:INTERNAL=1
> CMakeCache.txt://ADVANCED property for variable: VNL_CONFIG_ENABLE_SSE2
> CMakeCache.txt:VNL_CONFIG_ENABLE_SSE2-ADVANCED:INTERNAL=1
> CMakeCache.txt://ADVANCED property for variable:
> VNL_CONFIG_ENABLE_SSE2_ROUNDING
> CMakeCache.txt:VNL_CONFIG_ENABLE_SSE2_ROUNDING-ADVANCED:INTERNAL=1
> CMakeCache.txt:VXL_HAS_SSE2_HARDWARE_SUPPORT:INTERNAL=1
> CMakeCache.txt:VXL_HAS_SSE2_HARDWARE_SUPPORT_COMPILED:INTERNAL=TRUE
>
>
>
>      Luis
>
>
> --------------------------------------
> On Tue, May 17, 2011 at 4:28 AM, Shashwath T.R. <trshash at gmail.com> wrote:
> > Hi all,
> >
> > While compiling ITK master, I ran into this error:
> >
> >
> 1>D:\itk\ITK\Modules\ThirdParty\VNL\src\vxl\core\vnl/vnl_c_vector.txx(261) :
> > error C2039: 'arg_max' : is not a member of 'vnl_sse<double>'
> > 1>
> D:\itk\ITK\Modules\ThirdParty\VNL\src\vxl\core\vnl/vnl_sse.h(261)
> > : see declaration of 'vnl_sse<double>'
> > 1>
> > D:\itk\ITK\Modules\ThirdParty\VNL\src\vxl\core\vnl/vnl_c_vector.txx(259)
> :
> > while compiling class template member function 'unsigned int
> > vnl_c_vector<T>::arg_max(const T *,unsigned int)'
> > 1>        with
> > 1>        [
> > 1>            T=double
> > 1>        ]
> > 1>
> >
> ..\..\..\..\..\..\..\..\ITK\Modules\ThirdParty\VNL\src\vxl\core\vnl\Templates\vnl_c_vector+double-.cxx(3)
> > : see reference to class template instantiation 'vnl_c_vector<T>' being
> > compiled
> > 1>        with
> > 1>        [
> > 1>            T=double
> > 1>        ]
> >
> > Apparently, vnl_sse<float> and vnl_sse<double> are missing the methods
> > arg_min and arg_max. Adding them proved to be very simple - I simply
> copied
> > over the generic implementation and specialized it. I'm attaching my
> patch
> > below.
> >
> > Could someone take a look and see if this is OK?
> >
> > Regards,
> > Shash
> >
> > diff --git a/Modules/ThirdParty/VNL/src/vxl/core/vnl/vnl_sse.h
> > b/Modules/ThirdParty/VNL/src/vxl/core/vnl/vnl_sse.h
> > index 5af0f7c..94138a5 100644
> > -- a/Modules/ThirdParty/VNL/src/vxl/core/vnl/vnl_sse.h
> > ++ b/Modules/ThirdParty/VNL/src/vxl/core/vnl/vnl_sse.h
> > @@ -543,6 +543,27 @@ class vnl_sse<double>
> >     _mm_store_sd(&ret,min);
> >     return ret;
> >   }
> >  static VNL_SSE_FORCE_INLINE unsigned arg_max(const double* v, unsigned
> n)
> >  {
> >    if (n==0) return unsigned(-1); // the maximum of an empty set is
> > undefined
> >    double tmp = *v;
> >    unsigned idx = 0;
> >    for (unsigned i=1; i<n; ++i)
> >      if (*++v > tmp)
> >        tmp = *v, idx = i;
> >    return idx;
> >  }
> >
> >  static VNL_SSE_FORCE_INLINE unsigned arg_min(const double* v, unsigned
> n)
> >  {
> >    if (n==0) return unsigned(-1); // the minimum of an empty set is
> > undefined
> >    double tmp = *v;
> >    unsigned idx = 0;
> >    for (unsigned i=1; i<n; ++i)
> >      if (*++v < tmp)
> >        tmp = *v, idx = i;
> >    return idx;
> >  }
> > };
> >
> > //: SSE2 implementation for single precision floating point (32 bit)
> > @@ -880,6 +901,27 @@ class vnl_sse<float>
> >
> >     return ret;
> >   }
> > static VNL_SSE_FORCE_INLINE unsigned arg_max(const float* v, unsigned n)
> >  {
> >    if (n==0) return unsigned(-1); // the maximum of an empty set is
> > undefined
> >    float tmp = *v;
> >    unsigned idx = 0;
> >    for (unsigned i=1; i<n; ++i)
> >      if (*++v > tmp)
> >        tmp = *v, idx = i;
> >    return idx;
> >  }
> >
> >  static VNL_SSE_FORCE_INLINE unsigned arg_min(const float* v, unsigned n)
> >  {
> >    if (n==0) return unsigned(-1); // the minimum of an empty set is
> > undefined
> >    float tmp = *v;
> >    unsigned idx = 0;
> >    for (unsigned i=1; i<n; ++i)
> >      if (*++v < tmp)
> >        tmp = *v, idx = i;
> >    return idx;
> >  }
> > };
> >
> > #endif // VNL_CONFIG_ENABLE_SSE2
> >
> >
> > _____________________________________
> > Powered by www.kitware.com
> >
> > Visit other Kitware open-source projects at
> > http://www.kitware.com/opensource/opensource.html
> >
> > Kitware offers ITK Training Courses, for more information visit:
> > http://www.kitware.com/products/protraining.html
> >
> > Please keep messages on-topic and check the ITK FAQ at:
> > http://www.itk.org/Wiki/ITK_FAQ
> >
> > Follow this link to subscribe/unsubscribe:
> > http://www.itk.org/mailman/listinfo/insight-users
> >
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20110531/a7833f20/attachment.htm>


More information about the Insight-users mailing list