[ros-users] Question about cmake and SSE optimizations

Radu Bogdan Rusu rusu at willowgarage.com
Tue Mar 23 18:14:08 UTC 2010


Great job Rosen! That's exactly what I had in mind.

We should add SSE3 and SSE4. Gotta love that dot product :)

Cheers,
Radu.

Rosen Diankov wrote:
> i'm pasting cmake code i use for sse checks. it checks for both sse1
> and sse2, although similar checks can be used for sse3-5, there's also
> a check for msvc
> 
> # check for SSE extensions
> include(CheckCXXSourceRuns)
> if( CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX )
>   set(SSE_FLAGS)
> 
>   set(CMAKE_REQUIRED_FLAGS "-msse2")
>   check_cxx_source_runs("
>     #include <emmintrin.h>
> 
>     int main()
>     {
>         __m128d a, b;
>         double vals[2] = {0};
>         a = _mm_loadu_pd(vals);
>         b = _mm_add_pd(a,a);
>         _mm_storeu_pd(vals,b);
>         return 0;
>      }"
>      HAS_SSE2_EXTENSIONS)
> 
>   set(CMAKE_REQUIRED_FLAGS "-msse")
>   check_cxx_source_runs("
>     #include <xmmintrin.h>
>     int main()
>     {
>         __m128 a, b;
>         float vals[4] = {0};
>         a = _mm_loadu_ps(vals);
>         b = a;
>         b = _mm_add_ps(a,b);
>         _mm_storeu_ps(vals,b);
>         return 0;
>     }"
>     HAS_SSE_EXTENSIONS)
> 
>   set(CMAKE_REQUIRED_FLAGS)
> 
>   if(HAS_SSE2_EXTENSIONS)
>     message(STATUS "Using SSE2 extensions")
>     set(SSE_FLAGS "-msse2 -mfpmath=sse")
>   elseif(HAS_SSE_EXTENSIONS)
>     message(STATUS "Using SSE extensions")
>     set(SSE_FLAGS "-msse -mfpmath=sse")
>   endif()
> 
>   add_definitions(${SSE_FLAGS})
> elseif(MSVC)
>   check_cxx_source_runs("
>     #include <emmintrin.h>
> 
>     int main()
>     {
>         __m128d a, b;
>         double vals[2] = {0};
>         a = _mm_loadu_pd(vals);
>         b = _mm_add_pd(a,a);
>         _mm_storeu_pd(vals,b);
>         return 0;
>      }"
>      HAS_SSE2_EXTENSIONS)
>   if( HAS_SSE2_EXTENSIONS )
>     message(STATUS "Using SSE2 extensions")
>     add_definitions( "/arch:SSE2 /fp:fast -D__SSE__ -D__SSE2__" )
>   endif()
> endif()
> 
> 
> 
> 
> 
> 2010/3/24 Jose Gonzalez <de0a100 at gmail.com>:
>> Thanks for the comments?
>>
>> What about  check_cxx_compiler_flag("-msse2" COMPILER_SUPPORT_SSE2)?
>> Have you ever tried it?
>>
>> On Tue, Mar 23, 2010 at 12:16 PM, Radu Bogdan Rusu
>> <rusu at willowgarage.com> wrote:
>>> Depending on what compiler and cpu you use, some of these flags might be already turned on by default. You can check
>>> that using:
>>>
>>> $ gcc -Q -O3 --help=target
>>>
>>> for example.
>>>
>>> Other than that, we don't have a proper way to enable/disable different SSE optimizations for now. Most ROS packages
>>> cram a add_definitions ("-msse... etc") in their CMakeLists.txt.
>>>
>>> Patches to make this more standard across multiple platforms and enable/disable SSE1-5 automatically would be great!
>>>
>>> Cheers,
>>> Radu.
>>>
>>> Jose Gonzalez wrote:
>>>> Hi,
>>>>
>>>> Doing some experiments in the past with OpenCV (linux/g++) I realized
>>>> that there is a significant performance difference between the
>>>> versions compiled with autoconf and cmake. Digging in the compilation
>>>> scripts I came to the conclusion that the only extra flags that were
>>>> added by the autoconf scripts were the SSE optimizations (and openMP).
>>>>
>>>> Talking about the SSE optimizations, I can see how ROS sets the flags
>>>> in a similar way. When the detected platform is i686, all the SSE
>>>> optimizations are disabled by default (there is a comment "SSE/SSE2
>>>> might probably be not available for some old AMD or VIA processors").
>>>> Before finding out a solution by myself I'd like to ask the list if
>>>> somebody knows a standard way of testing for SSE optimizations in
>>>> cmake.
>>>>
>>>> Thanks,
>>>> Jose
>>>>
>>>> ------------------------------------------------------------------------------
>>>> Download Intel® Parallel Studio Eval
>>>> Try the new software tools for yourself. Speed compiling, find bugs
>>>> proactively, and fine-tune applications for parallel performance.
>>>> See why Intel Parallel Studio got high marks during beta.
>>>> http://p.sf.net/sfu/intel-sw-dev
>>>> _______________________________________________
>>>> ros-users mailing list
>>>> ros-users at lists.sourceforge.net
>>>> https://lists.sourceforge.net/lists/listinfo/ros-users
>>>> _______________________________________________
>>>> ros-users mailing list
>>>> ros-users at code.ros.org
>>>> https://code.ros.org/mailman/listinfo/ros-users
>>> --
>>> | Radu Bogdan Rusu | http://rbrusu.com/
>>> _______________________________________________
>>> ros-users mailing list
>>> ros-users at code.ros.org
>>> https://code.ros.org/mailman/listinfo/ros-users
>>>
>> _______________________________________________
>> ros-users mailing list
>> ros-users at code.ros.org
>> https://code.ros.org/mailman/listinfo/ros-users
>>

-- 
| Radu Bogdan Rusu | http://rbrusu.com/



More information about the ros-users mailing list