Skip to content

Commit 2ad1c09

Browse files
committed
opal/datatype: Add opal_short_float_t
The type `short float`, which is proposed in ISO/IEC JTC 1/SC 22 WG 14 (C WG), is not supported by most compilers yet. But some compilers (including gcc 7 for AArch64 and clang 6) support `_Float16`, which is defined in ISO/IEC TS 18661-3:2015 (ISO/IEC JTC 1/SC 22/WG 14 N1945) as an extensions for C. If it is detected in `configure`, it is used as an alternate type of `short float` in Open MPI internal code. This commit adds a `configure` option `--enable-alt-short-float=TYPE`. It can be used to specify a type other than `short float` and `_Float16` as the alternate type. Signed-off-by: KAWASHIMA Takahiro <t-kawashima@jp.fujitsu.com>
1 parent f6b3945 commit 2ad1c09

File tree

7 files changed

+103
-0
lines changed

7 files changed

+103
-0
lines changed

config/opal_check_alt_short_float.m4

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
dnl -*- shell-script -*-
2+
dnl
3+
dnl Copyright (c) 2018 FUJITSU LIMITED. All rights reserved.
4+
dnl $COPYRIGHT$
5+
dnl
6+
dnl Additional copyrights may follow
7+
dnl
8+
dnl $HEADER$
9+
dnl
10+
11+
# Check whether the user wants to use an alternate type of C 'short float'.
12+
13+
# OPAL_CHECK_ALT_SHORT_FLOAT
14+
# ------------------------------------------------------------
15+
AC_DEFUN([OPAL_CHECK_ALT_SHORT_FLOAT], [
16+
AC_CHECK_TYPES(_Float16)
17+
AC_MSG_CHECKING([if want alternate C type of short float])
18+
AC_ARG_ENABLE(alt-short-float,
19+
AC_HELP_STRING([--enable-alt-short-float=TYPE],
20+
[Use an alternate C type TYPE of 'short float' if 'short float' is not available on the C compiler. 'short float' is a new C type proposed for the next C language standard in ISO/IEC JTC 1/SC 22 WG 14 (C WG). (default: "_Float16" if available, disabled otherwise)]))
21+
if test "$enable_alt_short_float" = "yes"; then
22+
AC_MSG_ERROR([--enable-alt-short-float must have an argument.])
23+
elif test "$enable_alt_short_float" = "no"; then
24+
:
25+
elif test "$enable_alt_short_float" != ""; then
26+
opal_short_float_type="$enable_alt_short_float"
27+
opal_short_float_complex_type="$enable_alt_short_float [[2]]"
28+
elif test "$ac_cv_type_short_float" = "yes" && \
29+
test "$ac_cv_type_short_float__Complex" = "yes"; then
30+
opal_short_float_type="short float"
31+
opal_short_float_complex_type="short float _Complex"
32+
elif test "$ac_cv_type__Float16" = "yes"; then
33+
opal_short_float_type="_Float16"
34+
opal_short_float_complex_type="_Float16 [[2]]"
35+
fi
36+
if test "$opal_short_float_type" != ""; then
37+
AC_MSG_RESULT([yes ($opal_short_float_type)])
38+
AC_CHECK_TYPES($opal_short_float_type, [opal_enable_short_float=1], [opal_enable_short_float=0])
39+
if test "$opal_enable_short_float" = 1; then
40+
AC_DEFINE_UNQUOTED(opal_short_float_t, [[$opal_short_float_type]],
41+
[User-selected alternate C type of short float])
42+
AC_DEFINE_UNQUOTED(opal_short_float_complex_t, [[$opal_short_float_complex_type]],
43+
[User-selected alternate C type of short float _Complex])
44+
AC_CHECK_TYPES(opal_short_float_t)
45+
AC_CHECK_TYPES(opal_short_float_complex_t)
46+
AC_CHECK_SIZEOF(opal_short_float_t)
47+
AC_CHECK_SIZEOF(opal_short_float_complex_t)
48+
OPAL_C_GET_ALIGNMENT(opal_short_float_t, OPAL_ALIGNMENT_OPAL_SHORT_FLOAT_T)
49+
elif test "$enable_alt_short_float" != ""; then
50+
AC_MSG_ERROR([Alternate C type of short float $opal_short_float_type requested but not available. Aborting])
51+
fi
52+
else
53+
AC_MSG_RESULT([no])
54+
fi
55+
])

configure.ac

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,12 @@ OPAL_C_GET_ALIGNMENT(long double _Complex, OPAL_ALIGNMENT_LONG_DOUBLE_COMPLEX)
493493
OPAL_C_GET_ALIGNMENT(void *, OPAL_ALIGNMENT_VOID_P)
494494
OPAL_C_GET_ALIGNMENT(size_t, OPAL_ALIGNMENT_SIZE_T)
495495

496+
#
497+
# Check for an alternate type of C 'short float'
498+
#
499+
500+
OPAL_CHECK_ALT_SHORT_FLOAT
501+
496502
#
497503
# Check for other compiler characteristics
498504
#

ompi/tools/ompi_info/param.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,8 @@ void ompi_info_do_config(bool want_all)
375375
opal_info_out_int("C long size", "compiler:c:sizeof:long", sizeof(long));
376376
#if defined(HAVE_SHORT_FLOAT)
377377
opal_info_out_int("C short float size", "compiler:c:sizeof:short_float", sizeof(short float));
378+
#elif defined(HAVE_OPAL_SHORT_FLOAT_T)
379+
opal_info_out_int("C short float size", "compiler:c:sizeof:short_float", sizeof(opal_short_float_t));
378380
#endif
379381
opal_info_out_int("C float size", "compiler:c:sizeof:float", sizeof(float));
380382
opal_info_out_int("C double size", "compiler:c:sizeof:double", sizeof(double));
@@ -392,6 +394,8 @@ void ompi_info_do_config(bool want_all)
392394
opal_info_out_int("C int align", "compiler:c:align:int", OPAL_ALIGNMENT_INT);
393395
#if defined(HAVE_SHORT_FLOAT)
394396
opal_info_out_int("C short float align", "compiler:c:align:short_float", OPAL_ALIGNMENT_SHORT_FLOAT);
397+
#elif defined(HAVE_OPAL_SHORT_FLOAT_T)
398+
opal_info_out_int("C short float align", "compiler:c:align:short_float", OPAL_ALIGNMENT_OPAL_SHORT_FLOAT_T);
395399
#endif
396400
opal_info_out_int("C float align", "compiler:c:align:float", OPAL_ALIGNMENT_FLOAT);
397401
opal_info_out_int("C double align", "compiler:c:align:double", OPAL_ALIGNMENT_DOUBLE);

opal/datatype/opal_copy_functions.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,8 @@ COPY_TYPE( float_2, float, 1 )
158158
COPY_TYPE( float_2, double, 1 )
159159
#elif SIZEOF_LONG_DOUBLE == 2
160160
COPY_TYPE( float_2, long double, 1 )
161+
#elif defined(HAVE_OPAL_SHORT_FLOAT_T) && SIZEOF_OPAL_SHORT_FLOAT_T == 2
162+
COPY_TYPE( float_2, opal_short_float_t, 1 )
161163
#else
162164
/* #error No basic type for copy function for opal_datatype_float2 found */
163165
#define copy_float_2 NULL
@@ -171,6 +173,8 @@ COPY_TYPE( float_4, float, 1 )
171173
COPY_TYPE( float_4, double, 1 )
172174
#elif SIZEOF_LONG_DOUBLE == 4
173175
COPY_TYPE( float_4, long double, 1 )
176+
#elif defined(HAVE_OPAL_SHORT_FLOAT_T) && SIZEOF_OPAL_SHORT_FLOAT_T == 4
177+
COPY_TYPE( float_4, opal_short_float_t, 1 )
174178
#else
175179
#error No basic type for copy function for opal_datatype_float4 found
176180
#endif
@@ -183,6 +187,8 @@ COPY_TYPE( float_8, float, 1 )
183187
COPY_TYPE( float_8, double, 1 )
184188
#elif SIZEOF_LONG_DOUBLE == 8
185189
COPY_TYPE( float_8, long double, 1 )
190+
#elif defined(HAVE_OPAL_SHORT_FLOAT_T) && SIZEOF_OPAL_SHORT_FLOAT_T == 8
191+
COPY_TYPE( float_8, opal_short_float_t, 1 )
186192
#else
187193
#error No basic type for copy function for opal_datatype_float8 found
188194
#endif
@@ -195,6 +201,8 @@ COPY_TYPE( float_12, float, 1 )
195201
COPY_TYPE( float_12, double, 1 )
196202
#elif SIZEOF_LONG_DOUBLE == 12
197203
COPY_TYPE( float_12, long double, 1 )
204+
#elif defined(HAVE_OPAL_SHORT_FLOAT_T) && SIZEOF_OPAL_SHORT_FLOAT_T == 12
205+
COPY_TYPE( float_12, opal_short_float_t, 1 )
198206
#else
199207
/* #error No basic type for copy function for opal_datatype_float12 found */
200208
#define copy_float_12 NULL
@@ -208,13 +216,17 @@ COPY_TYPE( float_16, float, 1 )
208216
COPY_TYPE( float_16, double, 1 )
209217
#elif SIZEOF_LONG_DOUBLE == 16
210218
COPY_TYPE( float_16, long double, 1 )
219+
#elif defined(HAVE_OPAL_SHORT_FLOAT_T) && SIZEOF_OPAL_SHORT_FLOAT_T == 16
220+
COPY_TYPE( float_16, opal_short_float_t, 1 )
211221
#else
212222
/* #error No basic type for copy function for opal_datatype_float16 found */
213223
#define copy_float_16 NULL
214224
#endif
215225

216226
#if defined(HAVE_SHORT_FLOAT__COMPLEX)
217227
COPY_TYPE ( short_float_complex, short float _Complex, 1)
228+
#elif defined(HAVE_OPAL_SHORT_FLOAT_COMPLEX_T)
229+
COPY_TYPE ( short_float_complex, opal_short_float_complex_t, 1)
218230
#else
219231
/* #error No basic type for copy function for opal_datatype_short_float_complex found */
220232
#define copy_short_float_complex NULL

opal/datatype/opal_copy_functions_heterogeneous.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,8 @@ COPY_TYPE_HETEROGENEOUS( float2, float )
375375
COPY_TYPE_HETEROGENEOUS( float2, double )
376376
#elif SIZEOF_LONG_DOUBLE == 2
377377
COPY_TYPE_HETEROGENEOUS( float2, long double )
378+
#elif defined(HAVE_OPAL_SHORT_FLOAT_T) && SIZEOF_OPAL_SHORT_FLOAT_T == 2
379+
COPY_TYPE_HETEROGENEOUS( float2, opal_short_float_t )
378380
#else
379381
/* #error No basic type for copy function for opal_datatype_float2 found */
380382
#define copy_float2_heterogeneous NULL
@@ -388,6 +390,8 @@ COPY_TYPE_HETEROGENEOUS( float4, float )
388390
COPY_TYPE_HETEROGENEOUS( float4, double )
389391
#elif SIZEOF_LONG_DOUBLE == 4
390392
COPY_TYPE_HETEROGENEOUS( float4, long double )
393+
#elif defined(HAVE_OPAL_SHORT_FLOAT_T) && SIZEOF_OPAL_SHORT_FLOAT_T == 4
394+
COPY_TYPE_HETEROGENEOUS( float4, opal_short_float_t )
391395
#else
392396
/* #error No basic type for copy function for opal_datatype_float4 found */
393397
#define copy_float4_heterogeneous NULL
@@ -401,6 +405,8 @@ COPY_TYPE_HETEROGENEOUS( float8, float )
401405
COPY_TYPE_HETEROGENEOUS( float8, double )
402406
#elif SIZEOF_LONG_DOUBLE == 8
403407
COPY_TYPE_HETEROGENEOUS( float8, long double )
408+
#elif defined(HAVE_OPAL_SHORT_FLOAT_T) && SIZEOF_OPAL_SHORT_FLOAT_T == 8
409+
COPY_TYPE_HETEROGENEOUS( float8, opal_short_float_t )
404410
#else
405411
/* #error No basic type for copy function for opal_datatype_float8 found */
406412
#define copy_float8_heterogeneous NULL
@@ -414,6 +420,8 @@ COPY_TYPE_HETEROGENEOUS( float12, float )
414420
COPY_TYPE_HETEROGENEOUS( float12, double )
415421
#elif SIZEOF_LONG_DOUBLE == 12
416422
COPY_TYPE_HETEROGENEOUS( float12, long double )
423+
#elif defined(HAVE_OPAL_SHORT_FLOAT_T) && SIZEOF_OPAL_SHORT_FLOAT_T == 12
424+
COPY_TYPE_HETEROGENEOUS( float12, opal_short_float_t )
417425
#else
418426
/* #error No basic type for copy function for opal_datatype_float12 found */
419427
#define copy_float12_heterogeneous NULL
@@ -427,13 +435,17 @@ COPY_TYPE_HETEROGENEOUS( float16, float )
427435
COPY_TYPE_HETEROGENEOUS( float16, double )
428436
#elif SIZEOF_LONG_DOUBLE == 16
429437
COPY_TYPE_HETEROGENEOUS_INTERNAL( float16, long double, 1)
438+
#elif defined(HAVE_OPAL_SHORT_FLOAT_T) && SIZEOF_OPAL_SHORT_FLOAT_T == 16
439+
COPY_TYPE_HETEROGENEOUS( float16, opal_short_float_t )
430440
#else
431441
/* #error No basic type for copy function for opal_datatype_float16 found */
432442
#define copy_float16_heterogeneous NULL
433443
#endif
434444

435445
#if defined(HAVE_SHORT_FLOAT__COMPLEX)
436446
COPY_2SAMETYPE_HETEROGENEOUS( short_float_complex, short float _Complex )
447+
#elif defined(HAVE_OPAL_SHORT_FLOAT_COMPLEX_T)
448+
COPY_2SAMETYPE_HETEROGENEOUS( short_float_complex, opal_short_float_complex_t )
437449
#else
438450
/* #error No basic type for copy function for opal_datatype_short_float_complex found */
439451
#define copy_short_float_complex_heterogeneous NULL

opal/datatype/opal_datatype_internal.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,8 @@ struct opal_datatype_t;
361361
#define OPAL_DATATYPE_INITIALIZER_FLOAT2(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( double, OPAL_ALIGNMENT_DOUBLE, FLOAT2, FLAGS )
362362
#elif SIZEOF_LONG_DOUBLE == 2
363363
#define OPAL_DATATYPE_INITIALIZER_FLOAT2(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( long double, OPAL_ALIGNMENT_LONG_DOUBLE, FLOAT2, FLAGS )
364+
#elif defined(HAVE_OPAL_SHORT_FLOAT_T) && SIZEOF_OPAL_SHORT_FLOAT_T == 2
365+
#define OPAL_DATATYPE_INITIALIZER_FLOAT2(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( opal_short_float_t, OPAL_ALIGNMENT_OPAL_SHORT_FLOAT_T, FLOAT2, FLAGS )
364366
#else
365367
#define OPAL_DATATYPE_INITIALIZER_FLOAT2(FLAGS) OPAL_DATATYPE_INITIALIZER_UNAVAILABLE_NAMED( FLOAT2, FLAGS )
366368
#endif
@@ -373,6 +375,8 @@ struct opal_datatype_t;
373375
#define OPAL_DATATYPE_INITIALIZER_FLOAT4(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( double, OPAL_ALIGNMENT_DOUBLE, FLOAT4, FLAGS )
374376
#elif SIZEOF_LONG_DOUBLE == 4
375377
#define OPAL_DATATYPE_INITIALIZER_FLOAT4(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( long double, OPAL_ALIGNMENT_LONG_DOUBLE, FLOAT4, FLAGS )
378+
#elif defined(HAVE_OPAL_SHORT_FLOAT_T) && SIZEOF_OPAL_SHORT_FLOAT_T == 4
379+
#define OPAL_DATATYPE_INITIALIZER_FLOAT4(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( opal_short_float_t, OPAL_ALIGNMENT_OPAL_SHORT_FLOAT_T, FLOAT4, FLAGS )
376380
#else
377381
#define OPAL_DATATYPE_INITIALIZER_FLOAT4(FLAGS) OPAL_DATATYPE_INITIALIZER_UNAVAILABLE_NAMED( FLOAT4, FLAGS )
378382
#endif
@@ -385,6 +389,8 @@ struct opal_datatype_t;
385389
#define OPAL_DATATYPE_INITIALIZER_FLOAT8(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( double, OPAL_ALIGNMENT_DOUBLE, FLOAT8, FLAGS )
386390
#elif SIZEOF_LONG_DOUBLE == 8
387391
#define OPAL_DATATYPE_INITIALIZER_FLOAT8(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( long double, OPAL_ALIGNMENT_LONG_DOUBLE, FLOAT8, FLAGS )
392+
#elif defined(HAVE_OPAL_SHORT_FLOAT_T) && SIZEOF_OPAL_SHORT_FLOAT_T == 8
393+
#define OPAL_DATATYPE_INITIALIZER_FLOAT8(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( opal_short_float_t, OPAL_ALIGNMENT_OPAL_SHORT_FLOAT_T, FLOAT8, FLAGS )
388394
#else
389395
#define OPAL_DATATYPE_INITIALIZER_FLOAT8(FLAGS) OPAL_DATATYPE_INITIALIZER_UNAVAILABLE_NAMED( FLOAT8, FLAGS )
390396
#endif
@@ -397,6 +403,8 @@ struct opal_datatype_t;
397403
#define OPAL_DATATYPE_INITIALIZER_FLOAT12(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( double, OPAL_ALIGNMENT_DOUBLE, FLOAT12, FLAGS )
398404
#elif SIZEOF_LONG_DOUBLE == 12
399405
#define OPAL_DATATYPE_INITIALIZER_FLOAT12(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( long double, OPAL_ALIGNMENT_LONG_DOUBLE, FLOAT12, FLAGS )
406+
#elif defined(HAVE_OPAL_SHORT_FLOAT_T) && SIZEOF_OPAL_SHORT_FLOAT_T == 12
407+
#define OPAL_DATATYPE_INITIALIZER_FLOAT12(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( opal_short_float_t, OPAL_ALIGNMENT_OPAL_SHORT_FLOAT_T, FLOAT12, FLAGS )
400408
#else
401409
#define OPAL_DATATYPE_INITIALIZER_FLOAT12(FLAGS) OPAL_DATATYPE_INITIALIZER_UNAVAILABLE_NAMED( FLOAT12, FLAGS )
402410
#endif
@@ -409,12 +417,16 @@ struct opal_datatype_t;
409417
#define OPAL_DATATYPE_INITIALIZER_FLOAT16(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( double, OPAL_ALIGNMENT_DOUBLE, FLOAT16, FLAGS )
410418
#elif SIZEOF_LONG_DOUBLE == 16
411419
#define OPAL_DATATYPE_INITIALIZER_FLOAT16(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( long double, OPAL_ALIGNMENT_LONG_DOUBLE, FLOAT16, FLAGS )
420+
#elif defined(HAVE_OPAL_SHORT_FLOAT_T) && SIZEOF_OPAL_SHORT_FLOAT_T == 16
421+
#define OPAL_DATATYPE_INITIALIZER_FLOAT16(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( opal_short_float_t, OPAL_ALIGNMENT_OPAL_SHORT_FLOAT_T, FLOAT16, FLAGS )
412422
#else
413423
#define OPAL_DATATYPE_INITIALIZER_FLOAT16(FLAGS) OPAL_DATATYPE_INITIALIZER_UNAVAILABLE_NAMED( FLOAT16, FLAGS )
414424
#endif
415425

416426
#if defined(HAVE_SHORT_FLOAT__COMPLEX)
417427
#define OPAL_DATATYPE_INITIALIZER_SHORT_FLOAT_COMPLEX(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( short float _Complex, OPAL_ALIGNMENT_SHORT_FLOAT_COMPLEX, SHORT_FLOAT_COMPLEX, FLAGS )
428+
#elif defined(HAVE_OPAL_SHORT_FLOAT_COMPLEX_T)
429+
#define OPAL_DATATYPE_INITIALIZER_SHORT_FLOAT_COMPLEX(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( opal_short_float_complex_t, OPAL_ALIGNMENT_OPAL_SHORT_FLOAT_T, SHORT_FLOAT_COMPLEX, FLAGS )
418430
#else
419431
#define OPAL_DATATYPE_INITIALIZER_SHORT_FLOAT_COMPLEX(FLAGS) OPAL_DATATYPE_INITIALIZER_UNAVAILABLE_NAMED( SHORT_FLOAT_COMPLEX, FLAGS)
420432
#endif

opal/datatype/opal_datatype_module.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,8 @@ OPAL_DECLSPEC const size_t opal_datatype_local_sizes[OPAL_DATATYPE_MAX_PREDEFINE
109109
[OPAL_DATATYPE_FLOAT16] = 16, /* sizeof (float16) */
110110
#if defined(HAVE_SHORT_FLOAT__COMPLEX)
111111
[OPAL_DATATYPE_SHORT_FLOAT_COMPLEX] = sizeof(short float _Complex),
112+
#elif defined(HAVE_OPAL_SHORT_FLOAT_COMPLEX_T)
113+
[OPAL_DATATYPE_SHORT_FLOAT_COMPLEX] = sizeof(opal_short_float_complex_t),
112114
#else
113115
[OPAL_DATATYPE_SHORT_FLOAT_COMPLEX] = 4, /* typical sizeof(short float _Complex) */
114116
#endif

0 commit comments

Comments
 (0)