Skip to content

Commit fe01366

Browse files
authored
[SYCL] Add __imf_max/min/hadd to imf libdevice (#10127)
This PR adds 3 trivial functions to imf libdevice: __imf_max---->__nv_max __imf_min----->__nv_min __imf_hadd----->__nv_hadd Those 3 functions are located in imf_fp32_dl.cpp since some AI frameworks also need them.
1 parent a8b0356 commit fe01366

File tree

5 files changed

+54
-4
lines changed

5 files changed

+54
-4
lines changed

libdevice/imf/imf_fp32_dl.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,13 @@ float __devicelib_imf_fast_log10f(float x) { return __fast_log10f(x); }
4747

4848
DEVICE_EXTERN_C_INLINE
4949
float __devicelib_imf_fast_powf(float x, float y) { return __fast_powf(x, y); }
50+
51+
DEVICE_EXTERN_C_INLINE
52+
int __devicelib_imf_max(int x, int y) { return x > y ? x : y; }
53+
54+
DEVICE_EXTERN_C_INLINE
55+
int __devicelib_imf_min(int x, int y) { return x < y ? x : y; }
56+
57+
DEVICE_EXTERN_C_INLINE
58+
int __devicelib_imf_hadd(int x, int y) { return __shadd(x, y); }
5059
#endif /*__LIBDEVICE_IMF_ENABLED__*/

libdevice/imf_wrapper.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,12 @@ long long int __devicelib_imf_llmax(long long int, long long int);
298298
DEVICE_EXTERN_C_INLINE
299299
long long int __devicelib_imf_llmin(long long int, long long int);
300300

301+
DEVICE_EXTERN_C_INLINE
302+
int __devicelib_imf_max(int, int);
303+
304+
DEVICE_EXTERN_C_INLINE
305+
int __devicelib_imf_min(int, int);
306+
301307
DEVICE_EXTERN_C_INLINE
302308
unsigned long long int __devicelib_imf_ullmax(unsigned long long int,
303309
unsigned long long int);
@@ -322,6 +328,12 @@ long long int __imf_llmin(long long int x, long long int y) {
322328
return __devicelib_imf_llmin(x, y);
323329
}
324330

331+
DEVICE_EXTERN_C_INLINE
332+
int __imf_max(int x, int y) { return __devicelib_imf_max(x, y); }
333+
334+
DEVICE_EXTERN_C_INLINE
335+
int __imf_min(int x, int y) { return __devicelib_imf_min(x, y); }
336+
325337
DEVICE_EXTERN_C_INLINE
326338
unsigned long long int __imf_ullmax(unsigned long long int x,
327339
unsigned long long int y) {
@@ -422,6 +434,9 @@ int __imf_ffsll(long long int x) { return __devicelib_imf_ffsll(x); }
422434
DEVICE_EXTERN_C_INLINE
423435
int __devicelib_imf_rhadd(int, int);
424436

437+
DEVICE_EXTERN_C_INLINE
438+
int __devicelib_imf_hadd(int, int);
439+
425440
DEVICE_EXTERN_C_INLINE
426441
unsigned int __devicelib_imf_uhadd(int, int);
427442

@@ -431,6 +446,9 @@ unsigned int __devicelib_imf_urhadd(unsigned int, unsigned int);
431446
DEVICE_EXTERN_C_INLINE
432447
int __imf_rhadd(int x, int y) { return __devicelib_imf_rhadd(x, y); }
433448

449+
DEVICE_EXTERN_C_INLINE
450+
int __imf_hadd(int x, int y) { return __devicelib_imf_hadd(x, y); }
451+
434452
DEVICE_EXTERN_C_INLINE
435453
unsigned int __imf_uhadd(unsigned int x, unsigned int y) {
436454
return __devicelib_imf_uhadd(x, y);

llvm/tools/sycl-post-link/SYCLDeviceLibReqMask.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,8 @@ SYCLDeviceLibFuncMap SDLMap = {
173173
{"__devicelib_assert_fail", DeviceLibExt::cl_intel_devicelib_assert},
174174
{"__devicelib_imf_llmax", DeviceLibExt::cl_intel_devicelib_imf},
175175
{"__devicelib_imf_llmin", DeviceLibExt::cl_intel_devicelib_imf},
176+
{"__devicelib_imf_max", DeviceLibExt::cl_intel_devicelib_imf},
177+
{"__devicelib_imf_min", DeviceLibExt::cl_intel_devicelib_imf},
176178
{"__devicelib_imf_ullmax", DeviceLibExt::cl_intel_devicelib_imf},
177179
{"__devicelib_imf_ullmin", DeviceLibExt::cl_intel_devicelib_imf},
178180
{"__devicelib_imf_umax", DeviceLibExt::cl_intel_devicelib_imf},
@@ -190,6 +192,7 @@ SYCLDeviceLibFuncMap SDLMap = {
190192
{"__devicelib_imf_usad", DeviceLibExt::cl_intel_devicelib_imf},
191193
{"__devicelib_imf_uhadd", DeviceLibExt::cl_intel_devicelib_imf},
192194
{"__devicelib_imf_urhadd", DeviceLibExt::cl_intel_devicelib_imf},
195+
{"__devicelib_imf_hadd", DeviceLibExt::cl_intel_devicelib_imf},
193196
{"__devicelib_imf_rhadd", DeviceLibExt::cl_intel_devicelib_imf},
194197
{"__devicelib_imf_mul24", DeviceLibExt::cl_intel_devicelib_imf},
195198
{"__devicelib_imf_umul24", DeviceLibExt::cl_intel_devicelib_imf},

sycl/include/sycl/builtins.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3338,6 +3338,8 @@ extern __DPCPP_SYCL_EXTERNAL long long int __imf_llmax(long long int x,
33383338
long long int y);
33393339
extern __DPCPP_SYCL_EXTERNAL long long int __imf_llmin(long long int x,
33403340
long long int y);
3341+
extern __DPCPP_SYCL_EXTERNAL int __imf_max(int x, int y);
3342+
extern __DPCPP_SYCL_EXTERNAL int __imf_min(int x, int y);
33413343
extern __DPCPP_SYCL_EXTERNAL unsigned long long int
33423344
__imf_ullmax(unsigned long long int x, unsigned long long int y);
33433345
extern __DPCPP_SYCL_EXTERNAL unsigned long long int
@@ -3362,6 +3364,7 @@ extern __DPCPP_SYCL_EXTERNAL unsigned int __imf_sad(int x, int y,
33623364
extern __DPCPP_SYCL_EXTERNAL unsigned int
33633365
__imf_usad(unsigned int x, unsigned int y, unsigned int z);
33643366
extern __DPCPP_SYCL_EXTERNAL int __imf_rhadd(int x, int y);
3367+
extern __DPCPP_SYCL_EXTERNAL int __imf_hadd(int x, int y);
33653368
extern __DPCPP_SYCL_EXTERNAL unsigned int __imf_urhadd(unsigned int x,
33663369
unsigned int y);
33673370
extern __DPCPP_SYCL_EXTERNAL unsigned int __imf_uhadd(unsigned int x,

sycl/test-e2e/DeviceLib/imf_fp32_test.cpp

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ unsigned long long __imf_brevll(unsigned long long);
5757
unsigned __imf_byte_perm(unsigned, unsigned, unsigned);
5858
long long __imf_llmax(long long x, long long y);
5959
long long __imf_llmin(long long x, long long y);
60+
int __imf_max(int x, int y);
61+
int __imf_min(int x, int y);
6062
unsigned long long __imf_ullmax(unsigned long long x, unsigned long long y);
6163
unsigned long long __imf_ullmin(unsigned long long x, unsigned long long y);
6264
unsigned __imf_umax(unsigned x, unsigned y);
@@ -71,6 +73,7 @@ long long __imf_mul64hi(long long, long long);
7173
int __imf_popc(unsigned);
7274
int __imf_popcll(unsigned long long);
7375
int __imf_rhadd(int, int);
76+
int __imf_hadd(int, int);
7477
unsigned __imf_sad(int, int, unsigned);
7578
unsigned __imf_uhadd(unsigned, unsigned);
7679
unsigned __imf_umul24(unsigned, unsigned);
@@ -530,11 +533,25 @@ int main(int, char **) {
530533
std::initializer_list<int> input_vals2 = {99, 819933, -322,
531534
6832322, 1992983587, 6666483,
532535
-2000002194, 2147483646};
533-
std::initializer_list<int> ref_vals = {50, 410466, 4141757,
534-
3416078, 1912741435, 2771496,
535-
-1558824202, 2147483647};
536-
test2(device_queue, input_vals1, input_vals2, ref_vals, F2(__imf_rhadd));
536+
std::initializer_list<int> ref_vals1 = {99, 819933, 8283835,
537+
6832322, 1992983587, 6666483,
538+
-1117646211, 2147483647};
539+
std::initializer_list<int> ref_vals2 = {
540+
0, 999, -322, -166, 1832499282, -1123492, -2000002194, 2147483646};
541+
std::initializer_list<int> ref_vals3 = {50, 410466, 4141757,
542+
3416078, 1912741435, 2771496,
543+
-1558824202, 2147483647};
544+
std::initializer_list<int> ref_vals4 = {49, 410466, 4141756,
545+
3416078, 1912741434, 2771495,
546+
-1558824203, 2147483646};
547+
test2(device_queue, input_vals1, input_vals2, ref_vals1, F2(__imf_max));
548+
std::cout << "max passes." << std::endl;
549+
test2(device_queue, input_vals1, input_vals2, ref_vals2, F2(__imf_min));
550+
std::cout << "min passes." << std::endl;
551+
test2(device_queue, input_vals1, input_vals2, ref_vals3, F2(__imf_rhadd));
537552
std::cout << "rhadd passes." << std::endl;
553+
test2(device_queue, input_vals1, input_vals2, ref_vals4, F2(__imf_hadd));
554+
std::cout << "hadd passes." << std::endl;
538555
}
539556

540557
{

0 commit comments

Comments
 (0)