From 0d9b77b8adb521f6a0c04bb230832631b08d3b9d Mon Sep 17 00:00:00 2001 From: Dillon Sharlet Date: Sat, 2 Jul 2016 17:11:37 -0700 Subject: [PATCH 1/7] Pass small input buffers and scalars in a single buffer. --- .../arm-32-android/libhalide_hexagon_host.so | Bin 75056 -> 75116 bytes .../arm-64-android/libhalide_hexagon_host.so | Bin 17650 -> 17734 bytes .../bin/src/halide_hexagon_remote.h | 2 +- .../bin/src/halide_hexagon_remote_skel.c | 80 +++++++-------- .../bin/src/halide_hexagon_remote_stub.c | 93 ++++++++---------- .../bin/v60/libhalide_hexagon_remote_skel.so | Bin 36416 -> 36416 bytes .../hexagon_remote/halide_hexagon_remote.idl | 11 ++- src/runtime/hexagon_remote/halide_host.cpp | 52 ++++++++++ src/runtime/hexagon_remote/halide_remote.cpp | 23 +++-- 9 files changed, 151 insertions(+), 110 deletions(-) diff --git a/src/runtime/hexagon_remote/bin/arm-32-android/libhalide_hexagon_host.so b/src/runtime/hexagon_remote/bin/arm-32-android/libhalide_hexagon_host.so index 5d1d1650c9aaf1176cf33f262c0140763e867209..815fa9fa476dccf104b76eac2c02507bdeffbf0f 100755 GIT binary patch delta 14593 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

Qg(u%1uHU5WAG1v^`E318^ixCu>O;j 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 diff --git a/src/runtime/hexagon_remote/bin/src/halide_hexagon_remote.h b/src/runtime/hexagon_remote/bin/src/halide_hexagon_remote.h index 2166bd31fa09..9494fc3a876c 100644 --- a/src/runtime/hexagon_remote/bin/src/halide_hexagon_remote.h +++ b/src/runtime/hexagon_remote/bin/src/halide_hexagon_remote.h @@ -35,7 +35,7 @@ struct _halide_hexagon_remote_buffer__seq_octet { typedef unsigned int halide_hexagon_remote_handle_t; __QAIC_HEADER_EXPORT int __QAIC_HEADER(halide_hexagon_remote_initialize_kernels)(const unsigned char* code, int codeLen, halide_hexagon_remote_handle_t* module_ptr) __QAIC_HEADER_ATTRIBUTE; __QAIC_HEADER_EXPORT int __QAIC_HEADER(halide_hexagon_remote_get_symbol_v2)(halide_hexagon_remote_handle_t module_ptr, const char* name, int nameLen, halide_hexagon_remote_handle_t* sym_ptr) __QAIC_HEADER_ATTRIBUTE; -__QAIC_HEADER_EXPORT int __QAIC_HEADER(halide_hexagon_remote_run)(halide_hexagon_remote_handle_t module_ptr, halide_hexagon_remote_handle_t symbol, const halide_hexagon_remote_buffer* input_buffers, int input_buffersLen, halide_hexagon_remote_buffer* output_buffers, int output_buffersLen, const halide_hexagon_remote_buffer* input_scalars, int input_scalarsLen) __QAIC_HEADER_ATTRIBUTE; +__QAIC_HEADER_EXPORT int __QAIC_HEADER(halide_hexagon_remote_run_v2)(halide_hexagon_remote_handle_t module_ptr, halide_hexagon_remote_handle_t symbol, const halide_hexagon_remote_buffer* input_buffers, int input_buffersLen, halide_hexagon_remote_buffer* output_buffers, int output_buffersLen, int scalar_count, const unsigned char* small, int smallLen) __QAIC_HEADER_ATTRIBUTE; __QAIC_HEADER_EXPORT int __QAIC_HEADER(halide_hexagon_remote_release_kernels)(halide_hexagon_remote_handle_t module_ptr, int size) __QAIC_HEADER_ATTRIBUTE; __QAIC_HEADER_EXPORT int __QAIC_HEADER(halide_hexagon_remote_poll_log)(char* log, int logLen, int* read_size) __QAIC_HEADER_ATTRIBUTE; #ifdef __cplusplus diff --git a/src/runtime/hexagon_remote/bin/src/halide_hexagon_remote_skel.c b/src/runtime/hexagon_remote/bin/src/halide_hexagon_remote_skel.c index 578be3210633..ef928422440b 100644 --- a/src/runtime/hexagon_remote/bin/src/halide_hexagon_remote_skel.c +++ b/src/runtime/hexagon_remote/bin/src/halide_hexagon_remote_skel.c @@ -422,12 +422,12 @@ static const Type types[2]; static const SequenceType sequenceTypes[1] = {{&(types[1]),0x0,0x4,0x4,0x0}}; static const Type types[2] = {{0x1,{{(const uintptr_t)0,(const uintptr_t)0}}, 2,0x1},{SLIM_IFPTR32(0x8,0x10),{{(const uintptr_t)&(types[0]),(const uintptr_t)0x0}}, 9,SLIM_IFPTR32(0x4,0x8)}}; static const Parameter parameters[8] = {{SLIM_IFPTR32(0x8,0x10),{{(const uintptr_t)&(types[0]),(const uintptr_t)0x0}}, 9,SLIM_IFPTR32(0x4,0x8),0,0},{0x4,{{(const uintptr_t)0,(const uintptr_t)0}}, 2,0x4,3,0},{0x4,{{(const uintptr_t)0,(const uintptr_t)0}}, 2,0x4,0,0},{SLIM_IFPTR32(0x8,0x10),{{(const uintptr_t)&(sequenceTypes[0]),0}}, 25,SLIM_IFPTR32(0x4,0x8),0,0},{SLIM_IFPTR32(0x8,0x10),{{(const uintptr_t)&(sequenceTypes[0]),0}}, 25,SLIM_IFPTR32(0x4,0x8),3,0},{0x4,{{(const uintptr_t)0,(const uintptr_t)1}}, 2,0x4,0,0},{SLIM_IFPTR32(0x8,0x10),{{(const uintptr_t)&(types[0]),(const uintptr_t)0x0}}, 9,SLIM_IFPTR32(0x4,0x8),3,0},{0x4,{{(const uintptr_t)0,(const uintptr_t)1}}, 2,0x4,3,0}}; -static const Parameter* const parameterArrays[12] = {(&(parameters[2])),(&(parameters[2])),(&(parameters[3])),(&(parameters[4])),(&(parameters[3])),(&(parameters[2])),(&(parameters[0])),(&(parameters[1])),(&(parameters[6])),(&(parameters[7])),(&(parameters[2])),(&(parameters[5]))}; -static const Method methods[5] = {{REMOTE_SCALARS_MAKEX(0,0,0x2,0x1,0x0,0x0),0x4,0x4,3,2,(&(parameterArrays[6])),0x4,0x4},{REMOTE_SCALARS_MAKEX(0,0,0x2,0x1,0x0,0x0),0x8,0x4,4,3,(&(parameterArrays[5])),0x4,0x4},{REMOTE_SCALARS_MAKEX(0,0,255,255,15,15),0x14,0x0,9,5,(&(parameterArrays[0])),0x4,0x1},{REMOTE_SCALARS_MAKEX(0,0,0x1,0x0,0x0,0x0),0x8,0x0,2,2,(&(parameterArrays[10])),0x4,0x0},{REMOTE_SCALARS_MAKEX(0,0,0x1,0x2,0x0,0x0),0x4,0x4,4,2,(&(parameterArrays[8])),0x4,0x4}}; +static const Parameter* const parameterArrays[13] = {(&(parameters[2])),(&(parameters[2])),(&(parameters[3])),(&(parameters[4])),(&(parameters[5])),(&(parameters[0])),(&(parameters[2])),(&(parameters[0])),(&(parameters[1])),(&(parameters[6])),(&(parameters[7])),(&(parameters[2])),(&(parameters[5]))}; +static const Method methods[5] = {{REMOTE_SCALARS_MAKEX(0,0,0x2,0x1,0x0,0x0),0x4,0x4,3,2,(&(parameterArrays[7])),0x4,0x4},{REMOTE_SCALARS_MAKEX(0,0,0x2,0x1,0x0,0x0),0x8,0x4,4,3,(&(parameterArrays[6])),0x4,0x4},{REMOTE_SCALARS_MAKEX(0,0,255,255,15,15),0x18,0x0,10,6,(&(parameterArrays[0])),0x4,0x1},{REMOTE_SCALARS_MAKEX(0,0,0x1,0x0,0x0,0x0),0x8,0x0,2,2,(&(parameterArrays[11])),0x4,0x0},{REMOTE_SCALARS_MAKEX(0,0,0x1,0x2,0x0,0x0),0x4,0x4,4,2,(&(parameterArrays[9])),0x4,0x4}}; static const Method* const methodArrays[5] = {&(methods[0]),&(methods[1]),&(methods[2]),&(methods[3]),&(methods[4])}; -static const char strings[151] = "initialize_kernels\0release_kernels\0output_buffers\0input_scalars\0input_buffers\0get_symbol_v2\0module_ptr\0read_size\0poll_log\0sym_ptr\0symbol\0name\0code\0run\0"; -static const uint16_t methodStrings[19] = {147,92,130,64,35,50,78,92,137,122,113,118,103,19,92,108,0,142,92}; -static const uint16_t methodStringsArrays[5] = {16,6,0,13,10}; +static const char strings[159] = "initialize_kernels\0release_kernels\0output_buffers\0input_buffers\0get_symbol_v2\0scalar_count\0module_ptr\0read_size\0poll_log\0sym_ptr\0symbol\0run_v2\0small\0name\0code\0"; +static const uint16_t methodStrings[20] = {136,91,129,50,35,78,143,64,91,149,121,112,117,102,19,91,107,0,154,91}; +static const uint16_t methodStringsArrays[5] = {17,7,0,14,11}; __QAIC_SLIM_EXPORT const Interface __QAIC_SLIM(halide_hexagon_remote_slim) = {5,&(methodArrays[0]),0,0,&(methodStringsArrays [0]),methodStrings,strings}; #endif //_HALIDE_HEXAGON_REMOTE_SLIM_H #ifdef __cplusplus @@ -477,23 +477,23 @@ static __inline int _skel_method_1(int (*_pfn)(uint32_t, uint32_t), uint32_t _sc _CATCH(_nErr) {} return _nErr; } -static __inline int _skel_pack(remote_arg* _praROutPost, remote_arg* _ppraROutPost[1], void* _primROut, char* _in0[1], uint32_t _in0Len[1]) { +static __inline int _skel_pack(remote_arg* _praROutPost, remote_arg* _ppraROutPost[1], void* _primROut, char* _rout0[1], uint32_t _rout0Len[1]) { int _nErr = 0; remote_arg* _praROutPostStart = _praROutPost; remote_arg** _ppraROutPostStart = _ppraROutPost; _ppraROutPost = &_praROutPost; - _ppraROutPostStart[0] += (_praROutPost - _praROutPostStart) +0; + _ppraROutPostStart[0] += (_praROutPost - _praROutPostStart) +1; return _nErr; } -static __inline int _skel_pack_1(remote_arg* _praROutPost, remote_arg* _ppraROutPost[1], void* _primROut, char* _rout0[1], uint32_t _rout0Len[1]) { +static __inline int _skel_pack_1(remote_arg* _praROutPost, remote_arg* _ppraROutPost[1], void* _primROut, char* _in0[1], uint32_t _in0Len[1]) { int _nErr = 0; remote_arg* _praROutPostStart = _praROutPost; remote_arg** _ppraROutPostStart = _ppraROutPost; _ppraROutPost = &_praROutPost; - _ppraROutPostStart[0] += (_praROutPost - _praROutPostStart) +1; + _ppraROutPostStart[0] += (_praROutPost - _praROutPostStart) +0; return _nErr; } -static __inline int _skel_unpack(_allocator* _al, remote_arg* _praIn, remote_arg* _ppraIn[1], remote_arg* _praROut, remote_arg* _ppraROut[1], void* _primIn, void* _primROut, char* _in0[1], uint32_t _in0Len[1]) { +static __inline int _skel_unpack(_allocator* _al, remote_arg* _praIn, remote_arg* _ppraIn[1], remote_arg* _praROut, remote_arg* _ppraROut[1], void* _primIn, void* _primROut, char* _rout0[1], uint32_t _rout0Len[1]) { int _nErr = 0; remote_arg* _praInStart = _praIn; remote_arg** _ppraInStart = _ppraIn; @@ -501,15 +501,15 @@ static __inline int _skel_unpack(_allocator* _al, remote_arg* _praIn, remote_arg remote_arg** _ppraROutStart = _ppraROut; _ppraIn = &_praIn; _ppraROut = &_praROut; - _COPY(_in0Len, 0, _primIn, 0, 4); - _ASSERT(_nErr, (int)((_praIn[0].buf.nLen / 1)) >= (int)(_in0Len[0])); - _in0[0] = _praIn[0].buf.pv; - _ppraInStart[0] += (_praIn - _praInStart) + 1; - _ppraROutStart[0] += (_praROut - _praROutStart) +0; + _COPY(_rout0Len, 0, _primIn, 0, 4); + _ASSERT(_nErr, (int)((_praROut[0].buf.nLen / 1)) >= (int)(_rout0Len[0])); + _rout0[0] = _praROut[0].buf.pv; + _ppraInStart[0] += (_praIn - _praInStart) + 0; + _ppraROutStart[0] += (_praROut - _praROutStart) +1; _CATCH(_nErr) {} return _nErr; } -static __inline int _skel_unpack_1(_allocator* _al, remote_arg* _praIn, remote_arg* _ppraIn[1], remote_arg* _praROut, remote_arg* _ppraROut[1], void* _primIn, void* _primROut, char* _rout0[1], uint32_t _rout0Len[1]) { +static __inline int _skel_unpack_1(_allocator* _al, remote_arg* _praIn, remote_arg* _ppraIn[1], remote_arg* _praROut, remote_arg* _ppraROut[1], void* _primIn, void* _primROut, char* _in0[1], uint32_t _in0Len[1]) { int _nErr = 0; remote_arg* _praInStart = _praIn; remote_arg** _ppraInStart = _ppraIn; @@ -517,15 +517,15 @@ static __inline int _skel_unpack_1(_allocator* _al, remote_arg* _praIn, remote_a remote_arg** _ppraROutStart = _ppraROut; _ppraIn = &_praIn; _ppraROut = &_praROut; - _COPY(_rout0Len, 0, _primIn, 0, 4); - _ASSERT(_nErr, (int)((_praROut[0].buf.nLen / 1)) >= (int)(_rout0Len[0])); - _rout0[0] = _praROut[0].buf.pv; - _ppraInStart[0] += (_praIn - _praInStart) + 0; - _ppraROutStart[0] += (_praROut - _praROutStart) +1; + _COPY(_in0Len, 0, _primIn, 0, 4); + _ASSERT(_nErr, (int)((_praIn[0].buf.nLen / 1)) >= (int)(_in0Len[0])); + _in0[0] = _praIn[0].buf.pv; + _ppraInStart[0] += (_praIn - _praInStart) + 1; + _ppraROutStart[0] += (_praROut - _praROutStart) +0; _CATCH(_nErr) {} return _nErr; } -static __inline int _skel_method_2(int (*_pfn)(uint32_t, uint32_t, void*, uint32_t, void*, uint32_t, void*, uint32_t), uint32_t _sc, remote_arg* _pra) { +static __inline int _skel_method_2(int (*_pfn)(uint32_t, uint32_t, void*, uint32_t, void*, uint32_t, uint32_t, char*, uint32_t), uint32_t _sc, remote_arg* _pra) { remote_arg* _praEnd; uint32_t _in0[1]; uint32_t _in1[1]; @@ -533,8 +533,9 @@ static __inline int _skel_method_2(int (*_pfn)(uint32_t, uint32_t, void*, uint32 uint32_t _in2Len[1]; void* _rout3[1]; uint32_t _rout3Len[1]; - void* _in4[1]; - uint32_t _in4Len[1]; + uint32_t _in4[1]; + char* _in5[1]; + uint32_t _in5Len[1]; uint32_t* _primIn; int _numIn[1]; remote_arg* _praIn; @@ -550,12 +551,10 @@ static __inline int _skel_method_2(int (*_pfn)(uint32_t, uint32_t, void*, uint32 int _nErr = 0; char* _seq_primIn3; char* _seq_nat3; - char* _seq_primIn4; - char* _seq_nat4; _praEnd = ((_pra + REMOTE_SCALARS_INBUFS(_sc)) + REMOTE_SCALARS_OUTBUFS(_sc) + REMOTE_SCALARS_INHANDLES(_sc) + REMOTE_SCALARS_OUTHANDLES(_sc)); _ASSERT(_nErr, (_pra + ((4 + 0) + (0 + 0))) <= _praEnd); _numIn[0] = (REMOTE_SCALARS_INBUFS(_sc) - 1); - _ASSERT(_nErr, _pra[0].buf.nLen >= 20); + _ASSERT(_nErr, _pra[0].buf.nLen >= 24); _primIn = _pra[0].buf.pv; _praIn = (_pra + 1); _praROut = (_praIn + _numIn[0] + 0); @@ -568,34 +567,27 @@ static __inline int _skel_method_2(int (*_pfn)(uint32_t, uint32_t, void*, uint32 _ALLOCATE(_nErr, _al, (_in2Len[0] * SLIM_IFPTR32(8, 16)), SLIM_IFPTR32(4, 8), _in2[0]); for(_ii = 0, _seq_primIn2 = (char*)_praIn[0].buf.pv, _seq_nat2 = (char*)_in2[0];_ii < (int)_in2Len[0];++_ii, _seq_primIn2 = (_seq_primIn2 + 4), _seq_nat2 = (_seq_nat2 + SLIM_IFPTR32(8, 16))) { - _TRY(_nErr, _skel_unpack(_al, (_praIn + 1), _ppraIn, (_praROut + 0), _ppraROut, _seq_primIn2, 0, SLIM_IFPTR32((char**)&(((uint32_t*)_seq_nat2)[0]), (char**)&(((uint64_t*)_seq_nat2)[0])), SLIM_IFPTR32((uint32_t*)&(((uint32_t*)_seq_nat2)[1]), (uint32_t*)&(((uint32_t*)_seq_nat2)[2])))); + _TRY(_nErr, _skel_unpack_1(_al, (_praIn + 1), _ppraIn, (_praROut + 0), _ppraROut, _seq_primIn2, 0, SLIM_IFPTR32((char**)&(((uint32_t*)_seq_nat2)[0]), (char**)&(((uint64_t*)_seq_nat2)[0])), SLIM_IFPTR32((uint32_t*)&(((uint32_t*)_seq_nat2)[1]), (uint32_t*)&(((uint32_t*)_seq_nat2)[2])))); } _COPY(_rout3Len, 0, _primIn, 12, 4); _ASSERT(_nErr, (int)((_praIn[1].buf.nLen / 4)) >= (int)(_rout3Len[0])); _ALLOCATE(_nErr, _al, (_rout3Len[0] * SLIM_IFPTR32(8, 16)), SLIM_IFPTR32(4, 8), _rout3[0]); for(_ii = 0, _seq_primIn3 = (char*)_praIn[1].buf.pv, _seq_nat3 = (char*)_rout3[0];_ii < (int)_rout3Len[0];++_ii, _seq_primIn3 = (_seq_primIn3 + 4), _seq_nat3 = (_seq_nat3 + SLIM_IFPTR32(8, 16))) { - _TRY(_nErr, _skel_unpack_1(_al, (_praIn + 2), _ppraIn, (_praROut + 0), _ppraROut, _seq_primIn3, 0, SLIM_IFPTR32((char**)&(((uint32_t*)_seq_nat3)[0]), (char**)&(((uint64_t*)_seq_nat3)[0])), SLIM_IFPTR32((uint32_t*)&(((uint32_t*)_seq_nat3)[1]), (uint32_t*)&(((uint32_t*)_seq_nat3)[2])))); + _TRY(_nErr, _skel_unpack(_al, (_praIn + 2), _ppraIn, (_praROut + 0), _ppraROut, _seq_primIn3, 0, SLIM_IFPTR32((char**)&(((uint32_t*)_seq_nat3)[0]), (char**)&(((uint64_t*)_seq_nat3)[0])), SLIM_IFPTR32((uint32_t*)&(((uint32_t*)_seq_nat3)[1]), (uint32_t*)&(((uint32_t*)_seq_nat3)[2])))); } - _COPY(_in4Len, 0, _primIn, 16, 4); - _ASSERT(_nErr, (int)((_praIn[2].buf.nLen / 4)) >= (int)(_in4Len[0])); - _ALLOCATE(_nErr, _al, (_in4Len[0] * SLIM_IFPTR32(8, 16)), SLIM_IFPTR32(4, 8), _in4[0]); - for(_ii = 0, _seq_primIn4 = (char*)_praIn[2].buf.pv, _seq_nat4 = (char*)_in4[0];_ii < (int)_in4Len[0];++_ii, _seq_primIn4 = (_seq_primIn4 + 4), _seq_nat4 = (_seq_nat4 + SLIM_IFPTR32(8, 16))) - { - _TRY(_nErr, _skel_unpack(_al, (_praIn + 3), _ppraIn, (_praROut + 0), _ppraROut, _seq_primIn4, 0, SLIM_IFPTR32((char**)&(((uint32_t*)_seq_nat4)[0]), (char**)&(((uint64_t*)_seq_nat4)[0])), SLIM_IFPTR32((uint32_t*)&(((uint32_t*)_seq_nat4)[1]), (uint32_t*)&(((uint32_t*)_seq_nat4)[2])))); - } - _TRY(_nErr, _pfn(*_in0, *_in1, *_in2, *_in2Len, *_rout3, *_rout3Len, *_in4, *_in4Len)); + _COPY(_in4, 0, _primIn, 16, 4); + _COPY(_in5Len, 0, _primIn, 20, 4); + _ASSERT(_nErr, (int)((_praIn[2].buf.nLen / 1)) >= (int)(_in5Len[0])); + _in5[0] = _praIn[2].buf.pv; + _TRY(_nErr, _pfn(*_in0, *_in1, *_in2, *_in2Len, *_rout3, *_rout3Len, *_in4, *_in5, *_in5Len)); for(_ii = 0, _seq_nat2 = (char*)_in2[0];_ii < (int)_in2Len[0];++_ii, _seq_nat2 = (_seq_nat2 + SLIM_IFPTR32(8, 16))) { - _TRY(_nErr, _skel_pack((_praROutPost + 0), _ppraROutPost, 0, SLIM_IFPTR32((char**)&(((uint32_t*)_seq_nat2)[0]), (char**)&(((uint64_t*)_seq_nat2)[0])), SLIM_IFPTR32((uint32_t*)&(((uint32_t*)_seq_nat2)[1]), (uint32_t*)&(((uint32_t*)_seq_nat2)[2])))); + _TRY(_nErr, _skel_pack_1((_praROutPost + 0), _ppraROutPost, 0, SLIM_IFPTR32((char**)&(((uint32_t*)_seq_nat2)[0]), (char**)&(((uint64_t*)_seq_nat2)[0])), SLIM_IFPTR32((uint32_t*)&(((uint32_t*)_seq_nat2)[1]), (uint32_t*)&(((uint32_t*)_seq_nat2)[2])))); } for(_ii = 0, _seq_nat3 = (char*)_rout3[0];_ii < (int)_rout3Len[0];++_ii, _seq_nat3 = (_seq_nat3 + SLIM_IFPTR32(8, 16))) { - _TRY(_nErr, _skel_pack_1((_praROutPost + 0), _ppraROutPost, 0, SLIM_IFPTR32((char**)&(((uint32_t*)_seq_nat3)[0]), (char**)&(((uint64_t*)_seq_nat3)[0])), SLIM_IFPTR32((uint32_t*)&(((uint32_t*)_seq_nat3)[1]), (uint32_t*)&(((uint32_t*)_seq_nat3)[2])))); - } - for(_ii = 0, _seq_nat4 = (char*)_in4[0];_ii < (int)_in4Len[0];++_ii, _seq_nat4 = (_seq_nat4 + SLIM_IFPTR32(8, 16))) - { - _TRY(_nErr, _skel_pack((_praROutPost + 0), _ppraROutPost, 0, SLIM_IFPTR32((char**)&(((uint32_t*)_seq_nat4)[0]), (char**)&(((uint64_t*)_seq_nat4)[0])), SLIM_IFPTR32((uint32_t*)&(((uint32_t*)_seq_nat4)[1]), (uint32_t*)&(((uint32_t*)_seq_nat4)[2])))); + _TRY(_nErr, _skel_pack((_praROutPost + 0), _ppraROutPost, 0, SLIM_IFPTR32((char**)&(((uint32_t*)_seq_nat3)[0]), (char**)&(((uint64_t*)_seq_nat3)[0])), SLIM_IFPTR32((uint32_t*)&(((uint32_t*)_seq_nat3)[1]), (uint32_t*)&(((uint32_t*)_seq_nat3)[2])))); } _CATCH(_nErr) {} _allocator_deinit(_al); @@ -663,7 +655,7 @@ __QAIC_SKEL_EXPORT int __QAIC_SKEL(halide_hexagon_remote_skel_invoke)(uint32_t _ case 1: return _skel_method_3((void*)__QAIC_IMPL(halide_hexagon_remote_get_symbol_v2), _sc, _pra); case 2: - return _skel_method_2((void*)__QAIC_IMPL(halide_hexagon_remote_run), _sc, _pra); + return _skel_method_2((void*)__QAIC_IMPL(halide_hexagon_remote_run_v2), _sc, _pra); case 3: return _skel_method_1((void*)__QAIC_IMPL(halide_hexagon_remote_release_kernels), _sc, _pra); case 4: diff --git a/src/runtime/hexagon_remote/bin/src/halide_hexagon_remote_stub.c b/src/runtime/hexagon_remote/bin/src/halide_hexagon_remote_stub.c index 22fd9b17d1ba..565b520cbc75 100644 --- a/src/runtime/hexagon_remote/bin/src/halide_hexagon_remote_stub.c +++ b/src/runtime/hexagon_remote/bin/src/halide_hexagon_remote_stub.c @@ -422,12 +422,12 @@ static const Type types[2]; static const SequenceType sequenceTypes[1] = {{&(types[1]),0x0,0x4,0x4,0x0}}; static const Type types[2] = {{0x1,{{(const uintptr_t)0,(const uintptr_t)0}}, 2,0x1},{SLIM_IFPTR32(0x8,0x10),{{(const uintptr_t)&(types[0]),(const uintptr_t)0x0}}, 9,SLIM_IFPTR32(0x4,0x8)}}; static const Parameter parameters[8] = {{SLIM_IFPTR32(0x8,0x10),{{(const uintptr_t)&(types[0]),(const uintptr_t)0x0}}, 9,SLIM_IFPTR32(0x4,0x8),0,0},{0x4,{{(const uintptr_t)0,(const uintptr_t)0}}, 2,0x4,3,0},{0x4,{{(const uintptr_t)0,(const uintptr_t)0}}, 2,0x4,0,0},{SLIM_IFPTR32(0x8,0x10),{{(const uintptr_t)&(sequenceTypes[0]),0}}, 25,SLIM_IFPTR32(0x4,0x8),0,0},{SLIM_IFPTR32(0x8,0x10),{{(const uintptr_t)&(sequenceTypes[0]),0}}, 25,SLIM_IFPTR32(0x4,0x8),3,0},{0x4,{{(const uintptr_t)0,(const uintptr_t)1}}, 2,0x4,0,0},{SLIM_IFPTR32(0x8,0x10),{{(const uintptr_t)&(types[0]),(const uintptr_t)0x0}}, 9,SLIM_IFPTR32(0x4,0x8),3,0},{0x4,{{(const uintptr_t)0,(const uintptr_t)1}}, 2,0x4,3,0}}; -static const Parameter* const parameterArrays[12] = {(&(parameters[2])),(&(parameters[2])),(&(parameters[3])),(&(parameters[4])),(&(parameters[3])),(&(parameters[2])),(&(parameters[0])),(&(parameters[1])),(&(parameters[6])),(&(parameters[7])),(&(parameters[2])),(&(parameters[5]))}; -static const Method methods[5] = {{REMOTE_SCALARS_MAKEX(0,0,0x2,0x1,0x0,0x0),0x4,0x4,3,2,(&(parameterArrays[6])),0x4,0x4},{REMOTE_SCALARS_MAKEX(0,0,0x2,0x1,0x0,0x0),0x8,0x4,4,3,(&(parameterArrays[5])),0x4,0x4},{REMOTE_SCALARS_MAKEX(0,0,255,255,15,15),0x14,0x0,9,5,(&(parameterArrays[0])),0x4,0x1},{REMOTE_SCALARS_MAKEX(0,0,0x1,0x0,0x0,0x0),0x8,0x0,2,2,(&(parameterArrays[10])),0x4,0x0},{REMOTE_SCALARS_MAKEX(0,0,0x1,0x2,0x0,0x0),0x4,0x4,4,2,(&(parameterArrays[8])),0x4,0x4}}; +static const Parameter* const parameterArrays[13] = {(&(parameters[2])),(&(parameters[2])),(&(parameters[3])),(&(parameters[4])),(&(parameters[5])),(&(parameters[0])),(&(parameters[2])),(&(parameters[0])),(&(parameters[1])),(&(parameters[6])),(&(parameters[7])),(&(parameters[2])),(&(parameters[5]))}; +static const Method methods[5] = {{REMOTE_SCALARS_MAKEX(0,0,0x2,0x1,0x0,0x0),0x4,0x4,3,2,(&(parameterArrays[7])),0x4,0x4},{REMOTE_SCALARS_MAKEX(0,0,0x2,0x1,0x0,0x0),0x8,0x4,4,3,(&(parameterArrays[6])),0x4,0x4},{REMOTE_SCALARS_MAKEX(0,0,255,255,15,15),0x18,0x0,10,6,(&(parameterArrays[0])),0x4,0x1},{REMOTE_SCALARS_MAKEX(0,0,0x1,0x0,0x0,0x0),0x8,0x0,2,2,(&(parameterArrays[11])),0x4,0x0},{REMOTE_SCALARS_MAKEX(0,0,0x1,0x2,0x0,0x0),0x4,0x4,4,2,(&(parameterArrays[9])),0x4,0x4}}; static const Method* const methodArrays[5] = {&(methods[0]),&(methods[1]),&(methods[2]),&(methods[3]),&(methods[4])}; -static const char strings[151] = "initialize_kernels\0release_kernels\0output_buffers\0input_scalars\0input_buffers\0get_symbol_v2\0module_ptr\0read_size\0poll_log\0sym_ptr\0symbol\0name\0code\0run\0"; -static const uint16_t methodStrings[19] = {147,92,130,64,35,50,78,92,137,122,113,118,103,19,92,108,0,142,92}; -static const uint16_t methodStringsArrays[5] = {16,6,0,13,10}; +static const char strings[159] = "initialize_kernels\0release_kernels\0output_buffers\0input_buffers\0get_symbol_v2\0scalar_count\0module_ptr\0read_size\0poll_log\0sym_ptr\0symbol\0run_v2\0small\0name\0code\0"; +static const uint16_t methodStrings[20] = {136,91,129,50,35,78,143,64,91,149,121,112,117,102,19,91,107,0,154,91}; +static const uint16_t methodStringsArrays[5] = {17,7,0,14,11}; __QAIC_SLIM_EXPORT const Interface __QAIC_SLIM(halide_hexagon_remote_slim) = {5,&(methodArrays[0]),0,0,&(methodStringsArrays [0]),methodStrings,strings}; #endif //_HALIDE_HEXAGON_REMOTE_SLIM_H #ifdef __cplusplus @@ -575,23 +575,23 @@ __QAIC_STUB_EXPORT int __QAIC_STUB(halide_hexagon_remote_get_symbol_v2)(halide_h uint32_t _mid = 1; return _stub_method_1(_halide_hexagon_remote_handle(), _mid, (uint32_t*)&module_ptr, (char**)&name, (uint32_t*)&nameLen, (uint32_t*)sym_ptr); } -static __inline int _stub_unpack(remote_arg* _praROutPost, remote_arg* _ppraROutPost[1], void* _primROut, char* _in0[1], uint32_t _in0Len[1]) { +static __inline int _stub_unpack(remote_arg* _praROutPost, remote_arg* _ppraROutPost[1], void* _primROut, char* _rout0[1], uint32_t _rout0Len[1]) { int _nErr = 0; remote_arg* _praROutPostStart = _praROutPost; remote_arg** _ppraROutPostStart = _ppraROutPost; _ppraROutPost = &_praROutPost; - _ppraROutPostStart[0] += (_praROutPost - _praROutPostStart) +0; + _ppraROutPostStart[0] += (_praROutPost - _praROutPostStart) +1; return _nErr; } -static __inline int _stub_unpack_1(remote_arg* _praROutPost, remote_arg* _ppraROutPost[1], void* _primROut, char* _rout0[1], uint32_t _rout0Len[1]) { +static __inline int _stub_unpack_1(remote_arg* _praROutPost, remote_arg* _ppraROutPost[1], void* _primROut, char* _in0[1], uint32_t _in0Len[1]) { int _nErr = 0; remote_arg* _praROutPostStart = _praROutPost; remote_arg** _ppraROutPostStart = _ppraROutPost; _ppraROutPost = &_praROutPost; - _ppraROutPostStart[0] += (_praROutPost - _praROutPostStart) +1; + _ppraROutPostStart[0] += (_praROutPost - _praROutPostStart) +0; return _nErr; } -static __inline int _stub_pack(_allocator* _al, remote_arg* _praIn, remote_arg* _ppraIn[1], remote_arg* _praROut, remote_arg* _ppraROut[1], void* _primIn, void* _primROut, char* _in0[1], uint32_t _in0Len[1]) { +static __inline int _stub_pack(_allocator* _al, remote_arg* _praIn, remote_arg* _ppraIn[1], remote_arg* _praROut, remote_arg* _ppraROut[1], void* _primIn, void* _primROut, char* _rout0[1], uint32_t _rout0Len[1]) { int _nErr = 0; remote_arg* _praInStart = _praIn; remote_arg** _ppraInStart = _ppraIn; @@ -599,14 +599,14 @@ static __inline int _stub_pack(_allocator* _al, remote_arg* _praIn, remote_arg* remote_arg** _ppraROutStart = _ppraROut; _ppraIn = &_praIn; _ppraROut = &_praROut; - _COPY(_primIn, 0, _in0Len, 0, 4); - _praIn[0].buf.pv = _in0[0]; - _praIn[0].buf.nLen = (1 * _in0Len[0]); - _ppraInStart[0] += (_praIn - _praInStart) + 1; - _ppraROutStart[0] += (_praROut - _praROutStart) +0; + _COPY(_primIn, 0, _rout0Len, 0, 4); + _praROut[0].buf.pv = _rout0[0]; + _praROut[0].buf.nLen = (1 * _rout0Len[0]); + _ppraInStart[0] += (_praIn - _praInStart) + 0; + _ppraROutStart[0] += (_praROut - _praROutStart) +1; return _nErr; } -static __inline int _stub_pack_1(_allocator* _al, remote_arg* _praIn, remote_arg* _ppraIn[1], remote_arg* _praROut, remote_arg* _ppraROut[1], void* _primIn, void* _primROut, char* _rout0[1], uint32_t _rout0Len[1]) { +static __inline int _stub_pack_1(_allocator* _al, remote_arg* _praIn, remote_arg* _ppraIn[1], remote_arg* _praROut, remote_arg* _ppraROut[1], void* _primIn, void* _primROut, char* _in0[1], uint32_t _in0Len[1]) { int _nErr = 0; remote_arg* _praInStart = _praIn; remote_arg** _ppraInStart = _ppraIn; @@ -614,31 +614,30 @@ static __inline int _stub_pack_1(_allocator* _al, remote_arg* _praIn, remote_arg remote_arg** _ppraROutStart = _ppraROut; _ppraIn = &_praIn; _ppraROut = &_praROut; - _COPY(_primIn, 0, _rout0Len, 0, 4); - _praROut[0].buf.pv = _rout0[0]; - _praROut[0].buf.nLen = (1 * _rout0Len[0]); - _ppraInStart[0] += (_praIn - _praInStart) + 0; - _ppraROutStart[0] += (_praROut - _praROutStart) +1; + _COPY(_primIn, 0, _in0Len, 0, 4); + _praIn[0].buf.pv = _in0[0]; + _praIn[0].buf.nLen = (1 * _in0Len[0]); + _ppraInStart[0] += (_praIn - _praInStart) + 1; + _ppraROutStart[0] += (_praROut - _praROutStart) +0; return _nErr; } -static __inline void _count(int _numIn[1], int _numROut[1], char* _in0[1], uint32_t _in0Len[1]) { - _numIn[0] += 1; - _numROut[0] += 0; -} -static __inline void _count_1(int _numIn[1], int _numROut[1], char* _rout0[1], uint32_t _rout0Len[1]) { +static __inline void _count(int _numIn[1], int _numROut[1], char* _rout0[1], uint32_t _rout0Len[1]) { _numIn[0] += 0; _numROut[0] += 1; } -static __inline int _stub_method_2(remote_handle _handle, uint32_t _mid, uint32_t _in0[1], uint32_t _in1[1], void* _in2[1], uint32_t _in2Len[1], void* _rout3[1], uint32_t _rout3Len[1], void* _in4[1], uint32_t _in4Len[1]) { +static __inline void _count_1(int _numIn[1], int _numROut[1], char* _in0[1], uint32_t _in0Len[1]) { + _numIn[0] += 1; + _numROut[0] += 0; +} +static __inline int _stub_method_2(remote_handle _handle, uint32_t _mid, uint32_t _in0[1], uint32_t _in1[1], void* _in2[1], uint32_t _in2Len[1], void* _rout3[1], uint32_t _rout3Len[1], uint32_t _in4[1], char* _in5[1], uint32_t _in5Len[1]) { remote_arg* _pra; int _numIn[1]; int _numROut[1]; char* _seq_nat2; int _ii; char* _seq_nat3; - char* _seq_nat4; _allocator _al[1] = {{0}}; - uint32_t _primIn[5]; + uint32_t _primIn[6]; remote_arg* _praIn; remote_arg* _praROut; remote_arg* _praROutPost; @@ -648,20 +647,15 @@ static __inline int _stub_method_2(remote_handle _handle, uint32_t _mid, uint32_ char* _seq_primIn2; int _nErr = 0; char* _seq_primIn3; - char* _seq_primIn4; _numIn[0] = 3; _numROut[0] = 0; for(_ii = 0, _seq_nat2 = (char*)_in2[0];_ii < (int)_in2Len[0];++_ii, _seq_nat2 = (_seq_nat2 + SLIM_IFPTR32(8, 16))) { - _count(_numIn, _numROut, SLIM_IFPTR32((char**)&(((uint32_t*)_seq_nat2)[0]), (char**)&(((uint64_t*)_seq_nat2)[0])), SLIM_IFPTR32((uint32_t*)&(((uint32_t*)_seq_nat2)[1]), (uint32_t*)&(((uint32_t*)_seq_nat2)[2]))); + _count_1(_numIn, _numROut, SLIM_IFPTR32((char**)&(((uint32_t*)_seq_nat2)[0]), (char**)&(((uint64_t*)_seq_nat2)[0])), SLIM_IFPTR32((uint32_t*)&(((uint32_t*)_seq_nat2)[1]), (uint32_t*)&(((uint32_t*)_seq_nat2)[2]))); } for(_ii = 0, _seq_nat3 = (char*)_rout3[0];_ii < (int)_rout3Len[0];++_ii, _seq_nat3 = (_seq_nat3 + SLIM_IFPTR32(8, 16))) { - _count_1(_numIn, _numROut, SLIM_IFPTR32((char**)&(((uint32_t*)_seq_nat3)[0]), (char**)&(((uint64_t*)_seq_nat3)[0])), SLIM_IFPTR32((uint32_t*)&(((uint32_t*)_seq_nat3)[1]), (uint32_t*)&(((uint32_t*)_seq_nat3)[2]))); - } - for(_ii = 0, _seq_nat4 = (char*)_in4[0];_ii < (int)_in4Len[0];++_ii, _seq_nat4 = (_seq_nat4 + SLIM_IFPTR32(8, 16))) - { - _count(_numIn, _numROut, SLIM_IFPTR32((char**)&(((uint32_t*)_seq_nat4)[0]), (char**)&(((uint64_t*)_seq_nat4)[0])), SLIM_IFPTR32((uint32_t*)&(((uint32_t*)_seq_nat4)[1]), (uint32_t*)&(((uint32_t*)_seq_nat4)[2]))); + _count(_numIn, _numROut, SLIM_IFPTR32((char**)&(((uint32_t*)_seq_nat3)[0]), (char**)&(((uint64_t*)_seq_nat3)[0])), SLIM_IFPTR32((uint32_t*)&(((uint32_t*)_seq_nat3)[1]), (uint32_t*)&(((uint32_t*)_seq_nat3)[2]))); } _allocator_init(_al, 0, 0); _ALLOCATE(_nErr, _al, ((((_numIn[0] + _numROut[0]) + 1) + 0) * sizeof(_pra[0])), 4, _pra); @@ -677,42 +671,35 @@ static __inline int _stub_method_2(remote_handle _handle, uint32_t _mid, uint32_ _praIn[0].buf.nLen = (4 * _in2Len[0]); for(_ii = 0, _seq_primIn2 = (char*)_praIn[0].buf.pv, _seq_nat2 = (char*)_in2[0];_ii < (int)_in2Len[0];++_ii, _seq_primIn2 = (_seq_primIn2 + 4), _seq_nat2 = (_seq_nat2 + SLIM_IFPTR32(8, 16))) { - _TRY(_nErr, _stub_pack(_al, (_praIn + 1), _ppraIn, (_praROut + 0), _ppraROut, _seq_primIn2, 0, SLIM_IFPTR32((char**)&(((uint32_t*)_seq_nat2)[0]), (char**)&(((uint64_t*)_seq_nat2)[0])), SLIM_IFPTR32((uint32_t*)&(((uint32_t*)_seq_nat2)[1]), (uint32_t*)&(((uint32_t*)_seq_nat2)[2])))); + _TRY(_nErr, _stub_pack_1(_al, (_praIn + 1), _ppraIn, (_praROut + 0), _ppraROut, _seq_primIn2, 0, SLIM_IFPTR32((char**)&(((uint32_t*)_seq_nat2)[0]), (char**)&(((uint64_t*)_seq_nat2)[0])), SLIM_IFPTR32((uint32_t*)&(((uint32_t*)_seq_nat2)[1]), (uint32_t*)&(((uint32_t*)_seq_nat2)[2])))); } _COPY(_primIn, 12, _rout3Len, 0, 4); _ALLOCATE(_nErr, _al, (_rout3Len[0] * 4), 4, _praIn[1].buf.pv); _praIn[1].buf.nLen = (4 * _rout3Len[0]); for(_ii = 0, _seq_primIn3 = (char*)_praIn[1].buf.pv, _seq_nat3 = (char*)_rout3[0];_ii < (int)_rout3Len[0];++_ii, _seq_primIn3 = (_seq_primIn3 + 4), _seq_nat3 = (_seq_nat3 + SLIM_IFPTR32(8, 16))) { - _TRY(_nErr, _stub_pack_1(_al, (_praIn + 2), _ppraIn, (_praROut + 0), _ppraROut, _seq_primIn3, 0, SLIM_IFPTR32((char**)&(((uint32_t*)_seq_nat3)[0]), (char**)&(((uint64_t*)_seq_nat3)[0])), SLIM_IFPTR32((uint32_t*)&(((uint32_t*)_seq_nat3)[1]), (uint32_t*)&(((uint32_t*)_seq_nat3)[2])))); - } - _COPY(_primIn, 16, _in4Len, 0, 4); - _ALLOCATE(_nErr, _al, (_in4Len[0] * 4), 4, _praIn[2].buf.pv); - _praIn[2].buf.nLen = (4 * _in4Len[0]); - for(_ii = 0, _seq_primIn4 = (char*)_praIn[2].buf.pv, _seq_nat4 = (char*)_in4[0];_ii < (int)_in4Len[0];++_ii, _seq_primIn4 = (_seq_primIn4 + 4), _seq_nat4 = (_seq_nat4 + SLIM_IFPTR32(8, 16))) - { - _TRY(_nErr, _stub_pack(_al, (_praIn + 3), _ppraIn, (_praROut + 0), _ppraROut, _seq_primIn4, 0, SLIM_IFPTR32((char**)&(((uint32_t*)_seq_nat4)[0]), (char**)&(((uint64_t*)_seq_nat4)[0])), SLIM_IFPTR32((uint32_t*)&(((uint32_t*)_seq_nat4)[1]), (uint32_t*)&(((uint32_t*)_seq_nat4)[2])))); + _TRY(_nErr, _stub_pack(_al, (_praIn + 2), _ppraIn, (_praROut + 0), _ppraROut, _seq_primIn3, 0, SLIM_IFPTR32((char**)&(((uint32_t*)_seq_nat3)[0]), (char**)&(((uint64_t*)_seq_nat3)[0])), SLIM_IFPTR32((uint32_t*)&(((uint32_t*)_seq_nat3)[1]), (uint32_t*)&(((uint32_t*)_seq_nat3)[2])))); } + _COPY(_primIn, 16, _in4, 0, 4); + _COPY(_primIn, 20, _in5Len, 0, 4); + _praIn[2].buf.pv = _in5[0]; + _praIn[2].buf.nLen = (1 * _in5Len[0]); _TRY(_nErr, __QAIC_REMOTE(remote_handle_invoke)(_handle, REMOTE_SCALARS_MAKEX(0, _mid, (_numIn[0] + 1), (_numROut[0] + 0), 0, 0), _pra)); for(_ii = 0, _seq_nat2 = (char*)_in2[0];_ii < (int)_in2Len[0];++_ii, _seq_nat2 = (_seq_nat2 + SLIM_IFPTR32(8, 16))) { - _TRY(_nErr, _stub_unpack((_praROutPost + 0), _ppraROutPost, 0, SLIM_IFPTR32((char**)&(((uint32_t*)_seq_nat2)[0]), (char**)&(((uint64_t*)_seq_nat2)[0])), SLIM_IFPTR32((uint32_t*)&(((uint32_t*)_seq_nat2)[1]), (uint32_t*)&(((uint32_t*)_seq_nat2)[2])))); + _TRY(_nErr, _stub_unpack_1((_praROutPost + 0), _ppraROutPost, 0, SLIM_IFPTR32((char**)&(((uint32_t*)_seq_nat2)[0]), (char**)&(((uint64_t*)_seq_nat2)[0])), SLIM_IFPTR32((uint32_t*)&(((uint32_t*)_seq_nat2)[1]), (uint32_t*)&(((uint32_t*)_seq_nat2)[2])))); } for(_ii = 0, _seq_nat3 = (char*)_rout3[0];_ii < (int)_rout3Len[0];++_ii, _seq_nat3 = (_seq_nat3 + SLIM_IFPTR32(8, 16))) { - _TRY(_nErr, _stub_unpack_1((_praROutPost + 0), _ppraROutPost, 0, SLIM_IFPTR32((char**)&(((uint32_t*)_seq_nat3)[0]), (char**)&(((uint64_t*)_seq_nat3)[0])), SLIM_IFPTR32((uint32_t*)&(((uint32_t*)_seq_nat3)[1]), (uint32_t*)&(((uint32_t*)_seq_nat3)[2])))); - } - for(_ii = 0, _seq_nat4 = (char*)_in4[0];_ii < (int)_in4Len[0];++_ii, _seq_nat4 = (_seq_nat4 + SLIM_IFPTR32(8, 16))) - { - _TRY(_nErr, _stub_unpack((_praROutPost + 0), _ppraROutPost, 0, SLIM_IFPTR32((char**)&(((uint32_t*)_seq_nat4)[0]), (char**)&(((uint64_t*)_seq_nat4)[0])), SLIM_IFPTR32((uint32_t*)&(((uint32_t*)_seq_nat4)[1]), (uint32_t*)&(((uint32_t*)_seq_nat4)[2])))); + _TRY(_nErr, _stub_unpack((_praROutPost + 0), _ppraROutPost, 0, SLIM_IFPTR32((char**)&(((uint32_t*)_seq_nat3)[0]), (char**)&(((uint64_t*)_seq_nat3)[0])), SLIM_IFPTR32((uint32_t*)&(((uint32_t*)_seq_nat3)[1]), (uint32_t*)&(((uint32_t*)_seq_nat3)[2])))); } _CATCH(_nErr) {} _allocator_deinit(_al); return _nErr; } -__QAIC_STUB_EXPORT int __QAIC_STUB(halide_hexagon_remote_run)(halide_hexagon_remote_handle_t module_ptr, halide_hexagon_remote_handle_t symbol, const halide_hexagon_remote_buffer* input_buffers, int input_buffersLen, halide_hexagon_remote_buffer* output_buffers, int output_buffersLen, const halide_hexagon_remote_buffer* input_scalars, int input_scalarsLen) __QAIC_STUB_ATTRIBUTE { +__QAIC_STUB_EXPORT int __QAIC_STUB(halide_hexagon_remote_run_v2)(halide_hexagon_remote_handle_t module_ptr, halide_hexagon_remote_handle_t symbol, const halide_hexagon_remote_buffer* input_buffers, int input_buffersLen, halide_hexagon_remote_buffer* output_buffers, int output_buffersLen, int scalar_count, const unsigned char* small, int smallLen) __QAIC_STUB_ATTRIBUTE { uint32_t _mid = 2; - return _stub_method_2(_halide_hexagon_remote_handle(), _mid, (uint32_t*)&module_ptr, (uint32_t*)&symbol, (void**)&input_buffers, (uint32_t*)&input_buffersLen, (void**)&output_buffers, (uint32_t*)&output_buffersLen, (void**)&input_scalars, (uint32_t*)&input_scalarsLen); + return _stub_method_2(_halide_hexagon_remote_handle(), _mid, (uint32_t*)&module_ptr, (uint32_t*)&symbol, (void**)&input_buffers, (uint32_t*)&input_buffersLen, (void**)&output_buffers, (uint32_t*)&output_buffersLen, (uint32_t*)&scalar_count, (char**)&small, (uint32_t*)&smallLen); } static __inline int _stub_method_3(remote_handle _handle, uint32_t _mid, uint32_t _in0[1], uint32_t _in1[1]) { remote_arg _pra[1]; diff --git a/src/runtime/hexagon_remote/bin/v60/libhalide_hexagon_remote_skel.so b/src/runtime/hexagon_remote/bin/v60/libhalide_hexagon_remote_skel.so index 5837bcb0b56e326184faedb39b4114ba8a85e1fb..af16b952fd5fd9ca4a7da66581dc2b8e1db2930b 100755 GIT binary patch delta 13346 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 name, rout handle_t sym_ptr); // Routine to run a pipeline on the remote side. - long run(in handle_t module_ptr, in handle_t symbol, - in sequence input_buffers, - rout sequence output_buffers, - in sequence input_scalars); + // v2: Pass all scalars and small input buffers in a single + // buffer. The null input buffers are passed in the small buffer + // instead, followed by scalar_count scalars. + long run_v2(in handle_t module_ptr, in handle_t symbol, + in sequence input_buffers, + rout sequence output_buffers, + in long scalar_count, in buffer small); // Routine to clean up a module on the remote side. long release_kernels(in handle_t module_ptr, in long size); diff --git a/src/runtime/hexagon_remote/halide_host.cpp b/src/runtime/hexagon_remote/halide_host.cpp index 6fef7cf44cac..41e2eb83ea50 100644 --- a/src/runtime/hexagon_remote/halide_host.cpp +++ b/src/runtime/hexagon_remote/halide_host.cpp @@ -13,6 +13,7 @@ #include #include "bin/src/halide_hexagon_remote.h" +#include "pack_buffer.h" typedef halide_hexagon_remote_handle_t handle_t; typedef halide_hexagon_remote_buffer buffer; @@ -234,4 +235,55 @@ handle_t halide_hexagon_remote_get_symbol(handle_t module_ptr, return result == 0 ? sym : 0; } +// In v2, we pass all scalars and small input buffers in a single buffer. +int halide_hexagon_remote_run(handle_t module_ptr, handle_t function, + buffer *input_buffersPtrs, int input_buffersLen, + buffer *output_buffersPtrs, int output_buffersLen, + const buffer *input_scalarsPtrs, int input_scalarsLen) { + const int buffer_alignment = 128; + const int scalar_alignment = 4; + + int small_size = 0; + + // Add up the number and size of the small input buffers. + const int min_input_buffer_size = 4096; + for (int i = 0; i < input_buffersLen; i++) { + if (input_buffersPtrs[i].dataLen < min_input_buffer_size) { + small_size += packed_buffer_size(input_buffersPtrs[i].dataLen, buffer_alignment); + } + } + + // Add up the number and size of the scalars. + for (int i = 0; i < input_scalarsLen; i++) { + small_size += packed_buffer_size(input_scalarsPtrs[i].dataLen, scalar_alignment); + } + + // Allocate a buffer to hold the packed small buffers and scalars. + unsigned char *small = (unsigned char *)__builtin_alloca(small_size + buffer_alignment); + small = (unsigned char *)(((uintptr_t)small + buffer_alignment - 1) & ~(buffer_alignment - 1)); + + // Pack up the small buffers. + unsigned char *write = small; + for (int i = 0; i < input_buffersLen; i++) { + if (input_buffersPtrs[i].dataLen < min_input_buffer_size) { + write_buffer(write, input_buffersPtrs[i].data, input_buffersPtrs[i].dataLen, buffer_alignment); + + // Remove the buffer from the actual buffers list. + input_buffersPtrs[i].data = NULL; + input_buffersPtrs[i].dataLen = 0; + } + } + + // Pack up the scalars. + for (int i = 0; i < input_scalarsLen; i++) { + write_buffer(write, input_scalarsPtrs[i].data, input_scalarsPtrs[i].dataLen, scalar_alignment); + } + + // Call v2 with the adapted arguments. + return halide_hexagon_remote_run_v2(module_ptr, function, + input_buffersPtrs, input_buffersLen, + output_buffersPtrs, output_buffersLen, + input_scalarsLen, small, small_size); +} + } // extern "C" diff --git a/src/runtime/hexagon_remote/halide_remote.cpp b/src/runtime/hexagon_remote/halide_remote.cpp index dbe0ef3df278..c358352bdd96 100644 --- a/src/runtime/hexagon_remote/halide_remote.cpp +++ b/src/runtime/hexagon_remote/halide_remote.cpp @@ -21,6 +21,7 @@ extern "C" { #include "elf.h" #include "pipeline_context.h" #include "log.h" +#include "pack_buffer.h" const int stack_alignment = 128; const int stack_size = 1024 * 1024; @@ -197,10 +198,10 @@ int halide_hexagon_remote_get_symbol_v2(handle_t module_ptr, const char* name, i return *sym_ptr != 0 ? 0 : -1; } -int halide_hexagon_remote_run(handle_t module_ptr, handle_t function, - const buffer *input_buffersPtrs, int input_buffersLen, - buffer *output_buffersPtrs, int output_buffersLen, - const buffer *input_scalarsPtrs, int input_scalarsLen) { +int halide_hexagon_remote_run_v2(handle_t module_ptr, handle_t function, + const buffer *input_buffersPtrs, int input_buffersLen, + buffer *output_buffersPtrs, int output_buffersLen, + int scalar_count, const unsigned char *small, int smallLen) { // Get a pointer to the argv version of the pipeline. pipeline_argv_t pipeline = reinterpret_cast(function); @@ -214,24 +215,30 @@ int halide_hexagon_remote_run(handle_t module_ptr, handle_t function, uint64_t dev; uint8_t* host; }; - void **args = (void **)__builtin_alloca((input_buffersLen + input_scalarsLen + output_buffersLen) * sizeof(void *)); + void **args = (void **)__builtin_alloca((input_buffersLen + scalar_count + output_buffersLen) * sizeof(void *)); buffer_t *buffers = (buffer_t *)__builtin_alloca((input_buffersLen + output_buffersLen) * sizeof(buffer_t)); void **next_arg = &args[0]; buffer_t *next_buffer_t = &buffers[0]; // Input buffers come first. for (int i = 0; i < input_buffersLen; i++, next_arg++, next_buffer_t++) { - next_buffer_t->host = input_buffersPtrs[i].data; + if (input_buffersPtrs[i].data) { + // This buffer is passed directly. + next_buffer_t->host = input_buffersPtrs[i].data; + } else { + next_buffer_t->host = const_cast(read_buffer(small)); + } *next_arg = next_buffer_t; } + // Output buffers are next. for (int i = 0; i < output_buffersLen; i++, next_arg++, next_buffer_t++) { next_buffer_t->host = output_buffersPtrs[i].data; *next_arg = next_buffer_t; } // Input scalars are last. - for (int i = 0; i < input_scalarsLen; i++, next_arg++) { - *next_arg = input_scalarsPtrs[i].data; + for (int i = 0; i < scalar_count; i++, next_arg++) { + *next_arg = const_cast(read_buffer(small)); } // Call the pipeline and return the result. From f54b38ba006faa35f18dc2c62c8a331256f0f620 Mon Sep 17 00:00:00 2001 From: Dillon Sharlet Date: Sat, 2 Jul 2016 18:19:06 -0700 Subject: [PATCH 2/7] Make free list removal more clear. --- .../arm-32-android/libhalide_hexagon_host.so | Bin 75116 -> 79240 bytes .../arm-64-android/libhalide_hexagon_host.so | Bin 17734 -> 17769 bytes .../bin/v60/libhalide_hexagon_remote_skel.so | Bin 36416 -> 36416 bytes src/runtime/hexagon_remote/halide_host.cpp | 31 +++++++++++++----- 4 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/runtime/hexagon_remote/bin/arm-32-android/libhalide_hexagon_host.so b/src/runtime/hexagon_remote/bin/arm-32-android/libhalide_hexagon_host.so index 815fa9fa476dccf104b76eac2c02507bdeffbf0f..7e901c0650e95251c38a3e0b5201283c6e2b47e3 100755 GIT binary patch delta 15214 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 delta 14735 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 PeNRt+2ie`%(Lw$TyetHD delta 4436 zcmc&%eNa@_6~FhrUG{_BWtXqFtBJb{1R0F%BI=@`EE`9_c2YD>)x<+Ys`BiahTUDPvPd;t(3?gL zuZ<@Zmv6Dg_!etQzW93!Go1w*c%OnqpYuP=;UsrB2^}=cRf@Jn*zMR==kQ}%Mg#B> zt)M~3kv=eHp(Gzlsn;kI3#o^RP>!5If>0_4s2ifP;u^|C6>L4~laMip8;J-xp`L#}c`fxsWp02{~4U|_X!%;2Ui%q;{BW>;;lCL6;LtUU)E zM#bYnjyWFlYUpNk$l7^kM_Wok^R}(k=aGFktl3<8TRQdz2?lL`>%q3xK96)xLRJ zz)2qWYpTagV$*qyJtWdvbrE5ZX*`IyD$KOk1889 zzMiMAT!*)CzFvn1^EA87Iy}tr1|8m_;q62?6oI?BVw=ujl=CqiKFRq`9qwGDCALe4 zmvj7#ia$ZfY+x=J(;0MeoNy}i8#rGC=j;m9+MTo)_SzMX`Ef09lTP0Z3A<8P#HDRI zX)VWNI=qSFojUviP>0ekVs-1KobS=$lbr9>;hj9n86Dos@nId#8*Op8g6Eq?16sqfAXxo-_DUXV|J3F{YR(f6QnL4Lbs zCUwGVAOp9Ug_UgVKr8>*ec2f9*-(h<8pZxc)grfe1}VWj{3Df8B=kJ;QY=z#@xLJ9&901P#F+w9{Dn4!eq3h%k8pf_uEQ8}nB9LB zmoM~x0yn%$yU$35Uc-gQ}iF7x__;;pL z&!4!J6;6)JS^ZN_Rrk#t`fcyq(<#M=nQg$#vVbfvOvdz>d{o|cWd}N9d1Cou%ZZF; z#CtFWtr+MU>dzedRUg|sC%;4D?eBYsw+y=co2X=+h8Oa-(;M*nyfUe9W>CsMNOJ=_ z8xIEXmx%jIZB5bUT{|1$cERNhbiQ1%5kU)f^W9Xc1?kt3b|d{R(ov+Rk+M6&S)}Yj zc>$>#>Dha!)MlhTU!p$4k&aSWS6C=@-GNplr|-ZI3Jae;dnc7ruOJbJ?+x>tX%YLQ zPyX$%Hhvw#H-OHMvjC_!_atHXY3xIYi<=s4nSJG1h?bwxXOp^g%=o8cAPg#qo!NBL!%(2JOi`xVA7atyvuoW)?Z5 z!B|lbg;-JVps(01`&aUN0#jfu!g+_rl2>5MVlUoTU&f~oUSAyWcbYVjI7_eN>txNU z5poJXL){=)N&^01h6ZvIGR%)!GuLf{EhSa78(uH*x`JGWE8fGz1+cfMrQO9f|4-C| zS2V5Zs1Gg$6uCS|2fqw7QrZB~(tt~(LeOqVASx0j=qZ>$R4iA}?ciS$uypezbit*q+DoO>a&PDChm`=Axn@e;PjB2t+>Fm zEaVFEe^-$I&@MuBSv$qrXxXo67bKR4EL~w1nvi#3V)-VINTh~oPnpQ16V`_m++!VB zQyED&QiTqyoCzzefsk_lz0ENdb(m5o@-Rn;Uek%l#DlnPHWd%zcH)NWas|JO>T<2N z+gq-9#EKu(b>X}cTzUaI zP%3U=VJQhmAmO+5R)s@y$@xLU(Qa@8q391^PotbASlzvV0b zpj8i8zE-j2d#VDcUsqMb%Fimrqc1;m44S?f&Q&SW*dy?9)mr=z{9%P+AsJo-hHy3= W7>tL1V@Ti8yk}n{dA_x=k^C0|11GBh diff --git a/src/runtime/hexagon_remote/bin/v60/libhalide_hexagon_remote_skel.so b/src/runtime/hexagon_remote/bin/v60/libhalide_hexagon_remote_skel.so index af16b952fd5fd9ca4a7da66581dc2b8e1db2930b..f5e083559cecb55ae9a38fec9c472e3e427bab8e 100755 GIT binary patch delta 2089 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 LHuaO{1Cjp#n3AH( diff --git a/src/runtime/hexagon_remote/halide_host.cpp b/src/runtime/hexagon_remote/halide_host.cpp index 41e2eb83ea50..30354ed543fd 100644 --- a/src/runtime/hexagon_remote/halide_host.cpp +++ b/src/runtime/hexagon_remote/halide_host.cpp @@ -84,6 +84,7 @@ struct allocation_record { // Make a dummy allocation so we don't need a special case for the head node. allocation_record allocations = { NULL, }; +volatile int init_count = 0; pthread_mutex_t allocations_mutex; extern "C" { @@ -91,11 +92,21 @@ extern "C" { __attribute__((weak)) void remote_register_buf(void* buf, int size, int fd); void halide_hexagon_host_malloc_init() { - pthread_mutex_init(&allocations_mutex, NULL); + if (__sync_fetch_and_add(&init_count, 1) == 0) { + pthread_mutex_init(&allocations_mutex, NULL); + } } void halide_hexagon_host_malloc_deinit() { - pthread_mutex_destroy(&allocations_mutex); + if (__sync_fetch_and_sub(&init_count, 1) == 1) { + pthread_mutex_destroy(&allocations_mutex); + allocation_record *leaks = allocations.next; + while (leaks) { + __android_log_print(ANDROID_LOG_WARN, "halide", "leaked hexagon host allocation %p, size=%d", + leaks->buf, leaks->size); + leaks = leaks->next; + } + } } void *halide_hexagon_host_malloc(size_t size) { @@ -105,18 +116,20 @@ void *halide_hexagon_host_malloc(size_t size) { return NULL; } - const int heap_id = 25; // system heap + const int system_heap_id = 25; + const int heap_id = system_heap_id; const int ion_flags = 1; // cached - // Align the size up to pages. - size = (size + 0x1000 - 1) & ~(0x1000 - 1); - // Hexagon can only access a small number of mappings of these // sizes. We reduce the number of mappings required by aligning // large allocations to these sizes. static const size_t alignments[] = { 0x1000, 0x4000, 0x10000, 0x40000, 0x100000 }; size_t alignment = alignments[0]; - if (heap_id != 25) { + + // Align the size up to pages. + size = (size + alignment - 1) & ~(alignment - 1); + + if (heap_id != system_heap_id) { for (size_t i = 0; i < sizeof(alignments) / sizeof(alignments[0]); i++) { if (size >= alignments[i]) { alignment = alignments[i]; @@ -192,8 +205,8 @@ void halide_hexagon_host_free(void *ptr) { // Find the record for this allocation and remove it from the list. pthread_mutex_lock(&allocations_mutex); allocation_record *rec = &allocations; - while (rec->next) { - if (rec->next->buf == ptr) { + while (rec) { + if (rec->next && rec->next->buf == ptr) { allocation_record *before_rec = rec; rec = before_rec->next; before_rec->next = before_rec->next->next; From 90d2b472bc0e12144c44e66ecff9e0c7d395148b Mon Sep 17 00:00:00 2001 From: Dillon Sharlet Date: Sat, 2 Jul 2016 18:23:19 -0700 Subject: [PATCH 3/7] Add missing header. --- src/runtime/hexagon_remote/pack_buffer.h | 56 ++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 src/runtime/hexagon_remote/pack_buffer.h diff --git a/src/runtime/hexagon_remote/pack_buffer.h b/src/runtime/hexagon_remote/pack_buffer.h new file mode 100644 index 000000000000..9eedc3be9235 --- /dev/null +++ b/src/runtime/hexagon_remote/pack_buffer.h @@ -0,0 +1,56 @@ +#ifndef HALIDE_HEXAGON_REMOTE_BUFFER_PACKING_H +#define HALIDE_HEXAGON_REMOTE_BUFFER_PACKING_H + +#include + +template +void write_scalar(unsigned char *&write, const T& value) { + *(T *)write = value; + write += sizeof(T); +} + +template +T read_scalar(const unsigned char *&read) { + T value = *(T *)read; + read += sizeof(T); + return value; +} + +inline uint32_t packed_buffer_size(uint32_t size, uint32_t alignment) { + // We write the start and end offsets. + size += sizeof(uint32_t) * 2; + // We also need room for the padding. + size += alignment * 2; + + return size; +} + +// Given a pointer, compute an offset to add that is at least offset +// to ensure that start + aligned_offset(start, offset, alignment) is +// aligned to alignment. +inline uint32_t aligned_offset(const unsigned char *start, uint32_t offset, uint32_t alignment) { + uintptr_t x = (uintptr_t)start; + x = (x + offset + alignment - 1) & ~(alignment - 1); + return x - (uintptr_t)start; +} + +inline void write_buffer(unsigned char *&write, const unsigned char *buffer, uint32_t size, uint32_t alignment) { + unsigned char *start = write; + uint32_t header_size = sizeof(uint32_t) * 2; + uint32_t offset_start = aligned_offset(start, header_size, alignment); + uint32_t offset_end = aligned_offset(start, offset_start + size, alignment); + write_scalar(write, offset_start); + write_scalar(write, offset_end); + memcpy(start + offset_start, buffer, size); + write = start + offset_end; +} + +inline const unsigned char *read_buffer(const unsigned char *&read) { + const unsigned char *start = read; + uint32_t offset_start = read_scalar(read); + uint32_t offset_end = read_scalar(read); + read = start + offset_end; + return start + offset_start; +} + +#endif From 726ab41425682bc06c77a6214b25aeb38285d828 Mon Sep 17 00:00:00 2001 From: dsharletg Date: Tue, 11 Jul 2017 23:14:49 -0700 Subject: [PATCH 4/7] Add rebuilt runtime. --- .../arm-32-android/libhalide_hexagon_host.so | Bin 0 -> 79584 bytes .../arm-64-android/libhalide_hexagon_host.so | Bin 0 -> 22184 bytes .../bin/host/libhalide_hexagon_host.so | Bin 0 -> 95917 bytes .../bin/src/halide_hexagon_remote.h | 49 ++ .../bin/src/halide_hexagon_remote_skel.c | 733 ++++++++++++++++ .../bin/src/halide_hexagon_remote_stub.c | 810 ++++++++++++++++++ .../hexagon_remote/bin/v60/hexagon_sim_remote | Bin 0 -> 521504 bytes .../bin/v60/libhalide_hexagon_remote_skel.so | Bin 0 -> 32504 bytes .../libhalide_hexagon_remote_skel.so | Bin 0 -> 37888 bytes 9 files changed, 1592 insertions(+) create mode 100755 src/runtime/hexagon_remote/bin/arm-32-android/libhalide_hexagon_host.so create mode 100755 src/runtime/hexagon_remote/bin/arm-64-android/libhalide_hexagon_host.so create mode 100755 src/runtime/hexagon_remote/bin/host/libhalide_hexagon_host.so create mode 100644 src/runtime/hexagon_remote/bin/src/halide_hexagon_remote.h create mode 100644 src/runtime/hexagon_remote/bin/src/halide_hexagon_remote_skel.c create mode 100644 src/runtime/hexagon_remote/bin/src/halide_hexagon_remote_stub.c create mode 100755 src/runtime/hexagon_remote/bin/v60/hexagon_sim_remote create mode 100755 src/runtime/hexagon_remote/bin/v60/libhalide_hexagon_remote_skel.so create mode 100644 src/runtime/hexagon_remote/bin/v60/signed_by_debug/libhalide_hexagon_remote_skel.so diff --git a/src/runtime/hexagon_remote/bin/arm-32-android/libhalide_hexagon_host.so b/src/runtime/hexagon_remote/bin/arm-32-android/libhalide_hexagon_host.so new file mode 100755 index 0000000000000000000000000000000000000000..a16be44a6f4ebd4949d1b09d4ae9bf4151091ffa GIT binary patch literal 79584 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 literal 0 HcmV?d00001 diff --git a/src/runtime/hexagon_remote/bin/arm-64-android/libhalide_hexagon_host.so b/src/runtime/hexagon_remote/bin/arm-64-android/libhalide_hexagon_host.so new file mode 100755 index 0000000000000000000000000000000000000000..bea4a09f2f043991412e63090553c4894894a194 GIT binary patch literal 22184 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 literal 0 HcmV?d00001 diff --git a/src/runtime/hexagon_remote/bin/host/libhalide_hexagon_host.so b/src/runtime/hexagon_remote/bin/host/libhalide_hexagon_host.so new file mode 100755 index 0000000000000000000000000000000000000000..c8d43f57797514b2f7d8241acb1acd0b6f203f44 GIT binary patch literal 95917 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 + #define __QAIC_DBG_PRINTF__( ee ) do { printf ee ; } while(0) + #endif +#else + #define __QAIC_DBG_PRINTF__( ee ) (void)0 +#endif + + +#define _OFFSET(src, sof) ((void*)(((char*)(src)) + (sof))) + +#define _COPY(dst, dof, src, sof, sz) \ + do {\ + struct __copy { \ + char ar[sz]; \ + };\ + *(struct __copy*)_OFFSET(dst, dof) = *(struct __copy*)_OFFSET(src, sof);\ + } while (0) + +#define _COPYIF(dst, dof, src, sof, sz) \ + do {\ + if(_OFFSET(dst, dof) != _OFFSET(src, sof)) {\ + _COPY(dst, dof, src, sof, sz); \ + } \ + } while (0) + +_ATTRIBUTE_UNUSED +static __inline void _qaic_memmove(void* dst, void* src, int size) { + int i; + for(i = 0; i < size; ++i) { + ((char*)dst)[i] = ((char*)src)[i]; + } +} + +#define _MEMMOVEIF(dst, src, sz) \ + do {\ + if(dst != src) {\ + _qaic_memmove(dst, src, sz);\ + } \ + } while (0) + + +#define _ASSIGN(dst, src, sof) \ + do {\ + dst = OFFSET(src, sof); \ + } while (0) + +#define _STD_STRLEN_IF(str) (str == 0 ? 0 : strlen(str)) + +#include "AEEStdErr.h" + +#define _TRY(ee, func) \ + do { \ + if (AEE_SUCCESS != ((ee) = func)) {\ + __QAIC_DBG_PRINTF__((__FILE__ ":%d:error:%d:%s\n", __LINE__, (int)(ee),#func));\ + goto ee##bail;\ + } \ + } while (0) + +#define _CATCH(exception) exception##bail: if (exception != AEE_SUCCESS) + +#define _ASSERT(nErr, ff) _TRY(nErr, 0 == (ff) ? AEE_EBADPARM : AEE_SUCCESS) + +#ifdef __QAIC_DEBUG__ +#define _ALLOCATE(nErr, pal, size, alignment, pv) _TRY(nErr, _allocator_alloc(pal, __FILE_LINE__, size, alignment, (void**)&pv)) +#else +#define _ALLOCATE(nErr, pal, size, alignment, pv) _TRY(nErr, _allocator_alloc(pal, 0, size, alignment, (void**)&pv)) +#endif + + +#endif // _QAIC_ENV_H + +#include "remote.h" +#ifndef _ALLOCATOR_H +#define _ALLOCATOR_H + +#include +#include + +typedef struct _heap _heap; +struct _heap { + _heap* pPrev; + const char* loc; + uint64_t buf; +}; + +typedef struct _allocator { + _heap* pheap; + uint8_t* stack; + uint8_t* stackEnd; + int nSize; +} _allocator; + +_ATTRIBUTE_UNUSED +static __inline int _heap_alloc(_heap** ppa, const char* loc, int size, void** ppbuf) { + _heap* pn = 0; + pn = malloc(size + sizeof(_heap) - sizeof(uint64_t)); + if(pn != 0) { + pn->pPrev = *ppa; + pn->loc = loc; + *ppa = pn; + *ppbuf = (void*)&(pn->buf); + return 0; + } else { + return -1; + } +} +#define _ALIGN_SIZE(x, y) (((x) + (y-1)) & ~(y-1)) + +_ATTRIBUTE_UNUSED +static __inline int _allocator_alloc(_allocator* me, + const char* loc, + int size, + unsigned int al, + void** ppbuf) { + if(size < 0) { + return -1; + } else if (size == 0) { + *ppbuf = 0; + return 0; + } + if((_ALIGN_SIZE((uintptr_t)me->stackEnd, al) + size) < (uintptr_t)me->stack + me->nSize) { + *ppbuf = (uint8_t*)_ALIGN_SIZE((uintptr_t)me->stackEnd, al); + me->stackEnd = (uint8_t*)_ALIGN_SIZE((uintptr_t)me->stackEnd, al) + size; + return 0; + } else { + return _heap_alloc(&me->pheap, loc, size, ppbuf); + } +} + +_ATTRIBUTE_UNUSED +static __inline void _allocator_deinit(_allocator* me) { + _heap* pa = me->pheap; + while(pa != 0) { + _heap* pn = pa; + const char* loc = pn->loc; + (void)loc; + pa = pn->pPrev; + free(pn); + } +} + +_ATTRIBUTE_UNUSED +static __inline void _allocator_init(_allocator* me, uint8_t* stack, int stackSize) { + me->stack = stack; + me->stackEnd = stack + stackSize; + me->nSize = stackSize; + me->pheap = 0; +} + + +#endif // _ALLOCATOR_H + +#ifndef SLIM_H +#define SLIM_H + +#include + +//a C data structure for the idl types that can be used to implement +//static and dynamic language bindings fairly efficiently. +// +//the goal is to have a minimal ROM and RAM footprint and without +//doing too many allocations. A good way to package these things seemed +//like the module boundary, so all the idls within one module can share +//all the type references. + + +#define PARAMETER_IN 0x0 +#define PARAMETER_OUT 0x1 +#define PARAMETER_INOUT 0x2 +#define PARAMETER_ROUT 0x3 +#define PARAMETER_INROUT 0x4 + +//the types that we get from idl +#define TYPE_OBJECT 0x0 +#define TYPE_INTERFACE 0x1 +#define TYPE_PRIMITIVE 0x2 +#define TYPE_ENUM 0x3 +#define TYPE_STRING 0x4 +#define TYPE_WSTRING 0x5 +#define TYPE_STRUCTURE 0x6 +#define TYPE_UNION 0x7 +#define TYPE_ARRAY 0x8 +#define TYPE_SEQUENCE 0x9 + +//these require the pack/unpack to recurse +//so it's a hint to those languages that can optimize in cases where +//recursion isn't necessary. +#define TYPE_COMPLEX_STRUCTURE (0x10 | TYPE_STRUCTURE) +#define TYPE_COMPLEX_UNION (0x10 | TYPE_UNION) +#define TYPE_COMPLEX_ARRAY (0x10 | TYPE_ARRAY) +#define TYPE_COMPLEX_SEQUENCE (0x10 | TYPE_SEQUENCE) + + +typedef struct Type Type; + +#define INHERIT_TYPE\ + int32_t nativeSize; /*in the simple case its the same as wire size and alignment*/\ + union {\ + struct {\ + const uintptr_t p1;\ + const uintptr_t p2;\ + } _cast;\ + struct {\ + uint32_t iid;\ + uint32_t bNotNil;\ + } object;\ + struct {\ + const Type *arrayType;\ + int32_t nItems;\ + } array;\ + struct {\ + const Type *seqType;\ + int32_t nMaxLen;\ + } seqSimple; \ + struct {\ + uint32_t bFloating;\ + uint32_t bSigned;\ + } prim; \ + const SequenceType* seqComplex;\ + const UnionType *unionType;\ + const StructType *structType;\ + int32_t stringMaxLen;\ + uint8_t bInterfaceNotNil;\ + } param;\ + uint8_t type;\ + uint8_t nativeAlignment\ + +typedef struct UnionType UnionType; +typedef struct StructType StructType; +typedef struct SequenceType SequenceType; +struct Type { + INHERIT_TYPE; +}; + +struct SequenceType { + const Type * seqType; + uint32_t nMaxLen; + uint32_t inSize; + uint32_t routSizePrimIn; + uint32_t routSizePrimROut; +}; + +//byte offset from the start of the case values for +//this unions case value array. it MUST be aligned +//at the alignment requrements for the descriptor +// +//if negative it means that the unions cases are +//simple enumerators, so the value read from the descriptor +//can be used directly to find the correct case +typedef union CaseValuePtr CaseValuePtr; +union CaseValuePtr { + const uint8_t* value8s; + const uint16_t* value16s; + const uint32_t* value32s; + const uint64_t* value64s; +}; + +//these are only used in complex cases +//so I pulled them out of the type definition as references to make +//the type smaller +struct UnionType { + const Type *descriptor; + uint32_t nCases; + const CaseValuePtr caseValues; + const Type * const *cases; + int32_t inSize; + int32_t routSizePrimIn; + int32_t routSizePrimROut; + uint8_t inAlignment; + uint8_t routAlignmentPrimIn; + uint8_t routAlignmentPrimROut; + uint8_t inCaseAlignment; + uint8_t routCaseAlignmentPrimIn; + uint8_t routCaseAlignmentPrimROut; + uint8_t nativeCaseAlignment; + uint8_t bDefaultCase; +}; + +struct StructType { + uint32_t nMembers; + const Type * const *members; + int32_t inSize; + int32_t routSizePrimIn; + int32_t routSizePrimROut; + uint8_t inAlignment; + uint8_t routAlignmentPrimIn; + uint8_t routAlignmentPrimROut; +}; + +typedef struct Parameter Parameter; +struct Parameter { + INHERIT_TYPE; + uint8_t mode; + uint8_t bNotNil; +}; + +#define SLIM_IFPTR32(is32,is64) (sizeof(uintptr_t) == 4 ? (is32) : (is64)) +#define SLIM_SCALARS_IS_DYNAMIC(u) (((u) & 0x00ffffff) == 0x00ffffff) + +typedef struct Method Method; +struct Method { + uint32_t uScalars; //no method index + int32_t primInSize; + int32_t primROutSize; + int maxArgs; + int numParams; + const Parameter * const *params; + uint8_t primInAlignment; + uint8_t primROutAlignment; +}; + +typedef struct Interface Interface; + +struct Interface { + int nMethods; + const Method * const *methodArray; + int nIIds; + const uint32_t *iids; + const uint16_t* methodStringArray; + const uint16_t* methodStrings; + const char* strings; +}; + + +#endif //SLIM_H + + +#ifndef _HALIDE_HEXAGON_REMOTE_SLIM_H +#define _HALIDE_HEXAGON_REMOTE_SLIM_H +#include "remote.h" +#include + +#ifndef __QAIC_SLIM +#define __QAIC_SLIM(ff) ff +#endif +#ifndef __QAIC_SLIM_EXPORT +#define __QAIC_SLIM_EXPORT +#endif + +static const Type types[2]; +static const SequenceType sequenceTypes[1] = {{&(types[1]),0x0,0x4,0x4,0x0}}; +static const Type types[2] = {{0x1,{{(const uintptr_t)0,(const uintptr_t)0}}, 2,0x1},{SLIM_IFPTR32(0x8,0x10),{{(const uintptr_t)&(types[0]),(const uintptr_t)0x0}}, 9,SLIM_IFPTR32(0x4,0x8)}}; +static const Parameter parameters[8] = {{SLIM_IFPTR32(0x8,0x10),{{(const uintptr_t)&(types[0]),(const uintptr_t)0x0}}, 9,SLIM_IFPTR32(0x4,0x8),0,0},{0x4,{{(const uintptr_t)0,(const uintptr_t)0}}, 2,0x4,3,0},{0x4,{{(const uintptr_t)0,(const uintptr_t)0}}, 2,0x4,0,0},{SLIM_IFPTR32(0x8,0x10),{{(const uintptr_t)&(sequenceTypes[0]),0}}, 25,SLIM_IFPTR32(0x4,0x8),0,0},{SLIM_IFPTR32(0x8,0x10),{{(const uintptr_t)&(sequenceTypes[0]),0}}, 25,SLIM_IFPTR32(0x4,0x8),3,0},{0x4,{{(const uintptr_t)0,(const uintptr_t)1}}, 2,0x4,0,0},{SLIM_IFPTR32(0x8,0x10),{{(const uintptr_t)&(types[0]),(const uintptr_t)0x0}}, 9,SLIM_IFPTR32(0x4,0x8),3,0},{0x4,{{(const uintptr_t)0,(const uintptr_t)1}}, 2,0x4,3,0}}; +static const Parameter* const parameterArrays[21] = {(&(parameters[5])),(&(parameters[2])),(&(parameters[2])),(&(parameters[5])),(&(parameters[2])),(&(parameters[2])),(&(parameters[5])),(&(parameters[5])),(&(parameters[2])),(&(parameters[2])),(&(parameters[3])),(&(parameters[4])),(&(parameters[5])),(&(parameters[0])),(&(parameters[2])),(&(parameters[0])),(&(parameters[1])),(&(parameters[7])),(&(parameters[7])),(&(parameters[6])),(&(parameters[7]))}; +static const Method methods[9] = {{REMOTE_SCALARS_MAKEX(0,0,0x2,0x1,0x0,0x0),0x4,0x4,3,2,(&(parameterArrays[15])),0x4,0x4},{REMOTE_SCALARS_MAKEX(0,0,0x2,0x1,0x0,0x0),0x8,0x4,4,3,(&(parameterArrays[14])),0x4,0x4},{REMOTE_SCALARS_MAKEX(0,0,0x0,0x0,0x0,0x0),0x0,0x0,0,0,0,0x0,0x0},{REMOTE_SCALARS_MAKEX(0,0,255,255,15,15),0x18,0x0,10,6,(&(parameterArrays[8])),0x4,0x1},{REMOTE_SCALARS_MAKEX(0,0,0x1,0x0,0x0,0x0),0x4,0x0,1,1,(&(parameterArrays[1])),0x4,0x0},{REMOTE_SCALARS_MAKEX(0,0,0x1,0x2,0x0,0x0),0x4,0x4,4,2,(&(parameterArrays[19])),0x4,0x4},{REMOTE_SCALARS_MAKEX(0,0,0x0,0x1,0x0,0x0),0x0,0x8,2,2,(&(parameterArrays[17])),0x1,0x4},{REMOTE_SCALARS_MAKEX(0,0,0x1,0x0,0x0,0x0),0x4,0x0,1,1,(&(parameterArrays[0])),0x4,0x0},{REMOTE_SCALARS_MAKEX(0,0,0x1,0x0,0x0,0x0),0x20,0x0,8,8,(&(parameterArrays[0])),0x4,0x0}}; +static const Method* const methodArrays[10] = {&(methods[0]),&(methods[1]),&(methods[2]),&(methods[2]),&(methods[3]),&(methods[4]),&(methods[5]),&(methods[6]),&(methods[7]),&(methods[8])}; +static const char strings[357] = "initialize_kernels_v3\0busbwUsagePercentage\0set_performance_mode\0poll_profiler_state\0release_kernels_v2\0bwMegabytesPerSec\0set_performance\0output_buffers\0mipsPerThread\0input_buffers\0power_hvx_off\0get_symbol_v4\0scalar_count\0power_hvx_on\0set_latency\0set_bus_bw\0module_ptr\0mipsTotal\0read_size\0set_mips\0poll_log\0threads\0sym_ptr\0symbol\0run_v2\0small\0func\0name\0code\0"; +static const uint16_t methodStrings[35] = {121,288,152,268,246,103,22,234,238,329,257,322,166,137,208,336,194,257,347,314,64,342,306,297,302,278,0,352,257,43,59,84,257,180,221}; +static const uint16_t methodStringsArrays[10] = {26,16,34,33,9,31,23,20,29,0}; +__QAIC_SLIM_EXPORT const Interface __QAIC_SLIM(halide_hexagon_remote_slim) = {10,&(methodArrays[0]),0,0,&(methodStringsArrays [0]),methodStrings,strings}; +#endif //_HALIDE_HEXAGON_REMOTE_SLIM_H +extern int adsp_mmap_fd_getinfo(int, uint32_t *); +#ifdef __cplusplus +extern "C" { +#endif +static __inline int _skel_method(int (*_pfn)(uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t), uint32_t _sc, remote_arg* _pra) { + remote_arg* _praEnd; + uint32_t _in0[1]; + uint32_t _in1[1]; + uint32_t _in2[1]; + uint32_t _in3[1]; + uint32_t _in4[1]; + uint32_t _in5[1]; + uint32_t _in6[1]; + uint32_t _in7[1]; + uint32_t* _primIn; + int _nErr = 0; + _praEnd = ((_pra + REMOTE_SCALARS_INBUFS(_sc)) + REMOTE_SCALARS_OUTBUFS(_sc) + REMOTE_SCALARS_INHANDLES(_sc) + REMOTE_SCALARS_OUTHANDLES(_sc)); + _ASSERT(_nErr, (_pra + ((1 + 0) + (0 + 0))) <= _praEnd); + _ASSERT(_nErr, _pra[0].buf.nLen >= 32); + _primIn = _pra[0].buf.pv; + _COPY(_in0, 0, _primIn, 0, 4); + _COPY(_in1, 0, _primIn, 4, 4); + _COPY(_in2, 0, _primIn, 8, 4); + _COPY(_in3, 0, _primIn, 12, 4); + _COPY(_in4, 0, _primIn, 16, 4); + _COPY(_in5, 0, _primIn, 20, 4); + _COPY(_in6, 0, _primIn, 24, 4); + _COPY(_in7, 0, _primIn, 28, 4); + _TRY(_nErr, _pfn(*_in0, *_in1, *_in2, *_in3, *_in4, *_in5, *_in6, *_in7)); + _CATCH(_nErr) {} + return _nErr; +} +static __inline int _skel_method_1(int (*_pfn)(uint32_t), uint32_t _sc, remote_arg* _pra) { + remote_arg* _praEnd; + uint32_t _in0[1]; + uint32_t* _primIn; + int _nErr = 0; + _praEnd = ((_pra + REMOTE_SCALARS_INBUFS(_sc)) + REMOTE_SCALARS_OUTBUFS(_sc) + REMOTE_SCALARS_INHANDLES(_sc) + REMOTE_SCALARS_OUTHANDLES(_sc)); + _ASSERT(_nErr, (_pra + ((1 + 0) + (0 + 0))) <= _praEnd); + _ASSERT(_nErr, _pra[0].buf.nLen >= 4); + _primIn = _pra[0].buf.pv; + _COPY(_in0, 0, _primIn, 0, 4); + _TRY(_nErr, _pfn(*_in0)); + _CATCH(_nErr) {} + return _nErr; +} +static __inline int _skel_method_2(int (*_pfn)(uint32_t*, uint32_t*), uint32_t _sc, remote_arg* _pra) { + remote_arg* _praEnd; + uint32_t _rout0[1]; + uint32_t _rout1[1]; + uint32_t* _primROut; + int _numIn[1]; + int _nErr = 0; + _praEnd = ((_pra + REMOTE_SCALARS_INBUFS(_sc)) + REMOTE_SCALARS_OUTBUFS(_sc) + REMOTE_SCALARS_INHANDLES(_sc) + REMOTE_SCALARS_OUTHANDLES(_sc)); + _ASSERT(_nErr, (_pra + ((0 + 1) + (0 + 0))) <= _praEnd); + _numIn[0] = (REMOTE_SCALARS_INBUFS(_sc) - 0); + _ASSERT(_nErr, _pra[(_numIn[0] + 0)].buf.nLen >= 8); + _primROut = _pra[(_numIn[0] + 0)].buf.pv; + _TRY(_nErr, _pfn(_rout0, _rout1)); + _COPY(_primROut, 0, _rout0, 0, 4); + _COPY(_primROut, 4, _rout1, 0, 4); + _CATCH(_nErr) {} + return _nErr; +} +static __inline int _skel_method_3(int (*_pfn)(char*, uint32_t, uint32_t*), uint32_t _sc, remote_arg* _pra) { + remote_arg* _praEnd; + char* _rout0[1]; + uint32_t _rout0Len[1]; + uint32_t _rout1[1]; + uint32_t* _primIn; + int _numIn[1]; + uint32_t* _primROut; + remote_arg* _praIn; + remote_arg* _praROut; + int _nErr = 0; + _praEnd = ((_pra + REMOTE_SCALARS_INBUFS(_sc)) + REMOTE_SCALARS_OUTBUFS(_sc) + REMOTE_SCALARS_INHANDLES(_sc) + REMOTE_SCALARS_OUTHANDLES(_sc)); + _ASSERT(_nErr, (_pra + ((1 + 2) + (0 + 0))) <= _praEnd); + _numIn[0] = (REMOTE_SCALARS_INBUFS(_sc) - 1); + _ASSERT(_nErr, _pra[0].buf.nLen >= 4); + _primIn = _pra[0].buf.pv; + _ASSERT(_nErr, _pra[(_numIn[0] + 1)].buf.nLen >= 4); + _primROut = _pra[(_numIn[0] + 1)].buf.pv; + _COPY(_rout0Len, 0, _primIn, 0, 4); + _praIn = (_pra + 1); + _praROut = (_praIn + _numIn[0] + 1); + _ASSERT(_nErr, (int)((_praROut[0].buf.nLen / 1)) >= (int)(_rout0Len[0])); + _rout0[0] = _praROut[0].buf.pv; + _TRY(_nErr, _pfn(*_rout0, *_rout0Len, _rout1)); + _COPY(_primROut, 0, _rout1, 0, 4); + _CATCH(_nErr) {} + return _nErr; +} +static __inline int _skel_pack(remote_arg* _praROutPost, remote_arg* _ppraROutPost[1], void* _primROut, char* _rout0[1], uint32_t _rout0Len[1]) { + int _nErr = 0; + remote_arg* _praROutPostStart = _praROutPost; + remote_arg** _ppraROutPostStart = _ppraROutPost; + _ppraROutPost = &_praROutPost; + _ppraROutPostStart[0] += (_praROutPost - _praROutPostStart) +1; + return _nErr; +} +static __inline int _skel_pack_1(remote_arg* _praROutPost, remote_arg* _ppraROutPost[1], void* _primROut, char* _in0[1], uint32_t _in0Len[1]) { + int _nErr = 0; + remote_arg* _praROutPostStart = _praROutPost; + remote_arg** _ppraROutPostStart = _ppraROutPost; + _ppraROutPost = &_praROutPost; + _ppraROutPostStart[0] += (_praROutPost - _praROutPostStart) +0; + return _nErr; +} +static __inline int _skel_unpack(_allocator* _al, remote_arg* _praIn, remote_arg* _ppraIn[1], remote_arg* _praROut, remote_arg* _ppraROut[1], void* _primIn, void* _primROut, char* _rout0[1], uint32_t _rout0Len[1]) { + int _nErr = 0; + remote_arg* _praInStart = _praIn; + remote_arg** _ppraInStart = _ppraIn; + remote_arg* _praROutStart = _praROut; + remote_arg** _ppraROutStart = _ppraROut; + _ppraIn = &_praIn; + _ppraROut = &_praROut; + _COPY(_rout0Len, 0, _primIn, 0, 4); + _ASSERT(_nErr, (int)((_praROut[0].buf.nLen / 1)) >= (int)(_rout0Len[0])); + _rout0[0] = _praROut[0].buf.pv; + _ppraInStart[0] += (_praIn - _praInStart) + 0; + _ppraROutStart[0] += (_praROut - _praROutStart) +1; + _CATCH(_nErr) {} + return _nErr; +} +static __inline int _skel_unpack_1(_allocator* _al, remote_arg* _praIn, remote_arg* _ppraIn[1], remote_arg* _praROut, remote_arg* _ppraROut[1], void* _primIn, void* _primROut, char* _in0[1], uint32_t _in0Len[1]) { + int _nErr = 0; + remote_arg* _praInStart = _praIn; + remote_arg** _ppraInStart = _ppraIn; + remote_arg* _praROutStart = _praROut; + remote_arg** _ppraROutStart = _ppraROut; + _ppraIn = &_praIn; + _ppraROut = &_praROut; + _COPY(_in0Len, 0, _primIn, 0, 4); + _ASSERT(_nErr, (int)((_praIn[0].buf.nLen / 1)) >= (int)(_in0Len[0])); + _in0[0] = _praIn[0].buf.pv; + _ppraInStart[0] += (_praIn - _praInStart) + 1; + _ppraROutStart[0] += (_praROut - _praROutStart) +0; + _CATCH(_nErr) {} + return _nErr; +} +static __inline int _skel_method_4(int (*_pfn)(uint32_t, uint32_t, void*, uint32_t, void*, uint32_t, uint32_t, char*, uint32_t), uint32_t _sc, remote_arg* _pra) { + remote_arg* _praEnd; + uint32_t _in0[1]; + uint32_t _in1[1]; + void* _in2[1]; + uint32_t _in2Len[1]; + void* _rout3[1]; + uint32_t _rout3Len[1]; + uint32_t _in4[1]; + char* _in5[1]; + uint32_t _in5Len[1]; + uint32_t* _primIn; + int _numIn[1]; + remote_arg* _praIn; + remote_arg* _praROut; + remote_arg* _praROutPost; + remote_arg** _ppraROutPost = &_praROutPost; + _allocator _al[1] = {{0}}; + remote_arg** _ppraIn = &_praIn; + remote_arg** _ppraROut = &_praROut; + char* _seq_primIn2; + char* _seq_nat2; + int _ii; + int _nErr = 0; + char* _seq_primIn3; + char* _seq_nat3; + _praEnd = ((_pra + REMOTE_SCALARS_INBUFS(_sc)) + REMOTE_SCALARS_OUTBUFS(_sc) + REMOTE_SCALARS_INHANDLES(_sc) + REMOTE_SCALARS_OUTHANDLES(_sc)); + _ASSERT(_nErr, (_pra + ((4 + 0) + (0 + 0))) <= _praEnd); + _numIn[0] = (REMOTE_SCALARS_INBUFS(_sc) - 1); + _ASSERT(_nErr, _pra[0].buf.nLen >= 24); + _primIn = _pra[0].buf.pv; + _praIn = (_pra + 1); + _praROut = (_praIn + _numIn[0] + 0); + _praROutPost = _praROut; + _COPY(_in0, 0, _primIn, 0, 4); + _COPY(_in1, 0, _primIn, 4, 4); + _COPY(_in2Len, 0, _primIn, 8, 4); + _allocator_init(_al, 0, 0); + _ASSERT(_nErr, (int)((_praIn[0].buf.nLen / 4)) >= (int)(_in2Len[0])); + _ALLOCATE(_nErr, _al, (_in2Len[0] * SLIM_IFPTR32(8, 16)), SLIM_IFPTR32(4, 8), _in2[0]); + for(_ii = 0, _seq_primIn2 = (char*)_praIn[0].buf.pv, _seq_nat2 = (char*)_in2[0];_ii < (int)_in2Len[0];++_ii, _seq_primIn2 = (_seq_primIn2 + 4), _seq_nat2 = (_seq_nat2 + SLIM_IFPTR32(8, 16))) + { + _TRY(_nErr, _skel_unpack_1(_al, (_praIn + 1), _ppraIn, (_praROut + 0), _ppraROut, _seq_primIn2, 0, SLIM_IFPTR32((char**)&(((uint32_t*)_seq_nat2)[0]), (char**)&(((uint64_t*)_seq_nat2)[0])), SLIM_IFPTR32((uint32_t*)&(((uint32_t*)_seq_nat2)[1]), (uint32_t*)&(((uint32_t*)_seq_nat2)[2])))); + } + _COPY(_rout3Len, 0, _primIn, 12, 4); + _ASSERT(_nErr, (int)((_praIn[1].buf.nLen / 4)) >= (int)(_rout3Len[0])); + _ALLOCATE(_nErr, _al, (_rout3Len[0] * SLIM_IFPTR32(8, 16)), SLIM_IFPTR32(4, 8), _rout3[0]); + for(_ii = 0, _seq_primIn3 = (char*)_praIn[1].buf.pv, _seq_nat3 = (char*)_rout3[0];_ii < (int)_rout3Len[0];++_ii, _seq_primIn3 = (_seq_primIn3 + 4), _seq_nat3 = (_seq_nat3 + SLIM_IFPTR32(8, 16))) + { + _TRY(_nErr, _skel_unpack(_al, (_praIn + 2), _ppraIn, (_praROut + 0), _ppraROut, _seq_primIn3, 0, SLIM_IFPTR32((char**)&(((uint32_t*)_seq_nat3)[0]), (char**)&(((uint64_t*)_seq_nat3)[0])), SLIM_IFPTR32((uint32_t*)&(((uint32_t*)_seq_nat3)[1]), (uint32_t*)&(((uint32_t*)_seq_nat3)[2])))); + } + _COPY(_in4, 0, _primIn, 16, 4); + _COPY(_in5Len, 0, _primIn, 20, 4); + _ASSERT(_nErr, (int)((_praIn[2].buf.nLen / 1)) >= (int)(_in5Len[0])); + _in5[0] = _praIn[2].buf.pv; + _TRY(_nErr, _pfn(*_in0, *_in1, *_in2, *_in2Len, *_rout3, *_rout3Len, *_in4, *_in5, *_in5Len)); + for(_ii = 0, _seq_nat2 = (char*)_in2[0];_ii < (int)_in2Len[0];++_ii, _seq_nat2 = (_seq_nat2 + SLIM_IFPTR32(8, 16))) + { + _TRY(_nErr, _skel_pack_1((_praROutPost + 0), _ppraROutPost, 0, SLIM_IFPTR32((char**)&(((uint32_t*)_seq_nat2)[0]), (char**)&(((uint64_t*)_seq_nat2)[0])), SLIM_IFPTR32((uint32_t*)&(((uint32_t*)_seq_nat2)[1]), (uint32_t*)&(((uint32_t*)_seq_nat2)[2])))); + } + for(_ii = 0, _seq_nat3 = (char*)_rout3[0];_ii < (int)_rout3Len[0];++_ii, _seq_nat3 = (_seq_nat3 + SLIM_IFPTR32(8, 16))) + { + _TRY(_nErr, _skel_pack((_praROutPost + 0), _ppraROutPost, 0, SLIM_IFPTR32((char**)&(((uint32_t*)_seq_nat3)[0]), (char**)&(((uint64_t*)_seq_nat3)[0])), SLIM_IFPTR32((uint32_t*)&(((uint32_t*)_seq_nat3)[1]), (uint32_t*)&(((uint32_t*)_seq_nat3)[2])))); + } + _CATCH(_nErr) {} + _allocator_deinit(_al); + return _nErr; +} +static __inline int _skel_method_5(int (*_pfn)(void), uint32_t _sc, remote_arg* _pra) { + remote_arg* _praEnd; + int _nErr = 0; + _praEnd = ((_pra + REMOTE_SCALARS_INBUFS(_sc)) + REMOTE_SCALARS_OUTBUFS(_sc) + REMOTE_SCALARS_INHANDLES(_sc) + REMOTE_SCALARS_OUTHANDLES(_sc)); + _ASSERT(_nErr, (_pra + ((0 + 0) + (0 + 0))) <= _praEnd); + _TRY(_nErr, _pfn()); + _CATCH(_nErr) {} + return _nErr; +} +static __inline int _skel_method_6(int (*_pfn)(uint32_t, char*, uint32_t, uint32_t*), uint32_t _sc, remote_arg* _pra) { + remote_arg* _praEnd; + uint32_t _in0[1]; + char* _in1[1]; + uint32_t _in1Len[1]; + uint32_t _rout2[1]; + uint32_t* _primIn; + int _numIn[1]; + uint32_t* _primROut; + remote_arg* _praIn; + int _nErr = 0; + _praEnd = ((_pra + REMOTE_SCALARS_INBUFS(_sc)) + REMOTE_SCALARS_OUTBUFS(_sc) + REMOTE_SCALARS_INHANDLES(_sc) + REMOTE_SCALARS_OUTHANDLES(_sc)); + _ASSERT(_nErr, (_pra + ((2 + 1) + (0 + 0))) <= _praEnd); + _numIn[0] = (REMOTE_SCALARS_INBUFS(_sc) - 1); + _ASSERT(_nErr, _pra[0].buf.nLen >= 8); + _primIn = _pra[0].buf.pv; + _ASSERT(_nErr, _pra[(_numIn[0] + 1)].buf.nLen >= 4); + _primROut = _pra[(_numIn[0] + 1)].buf.pv; + _COPY(_in0, 0, _primIn, 0, 4); + _COPY(_in1Len, 0, _primIn, 4, 4); + _praIn = (_pra + 1); + _ASSERT(_nErr, (int)((_praIn[0].buf.nLen / 1)) >= (int)(_in1Len[0])); + _in1[0] = _praIn[0].buf.pv; + _TRY(_nErr, _pfn(*_in0, *_in1, *_in1Len, _rout2)); + _COPY(_primROut, 0, _rout2, 0, 4); + _CATCH(_nErr) {} + return _nErr; +} +static __inline int _skel_method_7(int (*_pfn)(char*, uint32_t, uint32_t*), uint32_t _sc, remote_arg* _pra) { + remote_arg* _praEnd; + char* _in0[1]; + uint32_t _in0Len[1]; + uint32_t _rout1[1]; + uint32_t* _primIn; + int _numIn[1]; + uint32_t* _primROut; + remote_arg* _praIn; + int _nErr = 0; + _praEnd = ((_pra + REMOTE_SCALARS_INBUFS(_sc)) + REMOTE_SCALARS_OUTBUFS(_sc) + REMOTE_SCALARS_INHANDLES(_sc) + REMOTE_SCALARS_OUTHANDLES(_sc)); + _ASSERT(_nErr, (_pra + ((2 + 1) + (0 + 0))) <= _praEnd); + _numIn[0] = (REMOTE_SCALARS_INBUFS(_sc) - 1); + _ASSERT(_nErr, _pra[0].buf.nLen >= 4); + _primIn = _pra[0].buf.pv; + _ASSERT(_nErr, _pra[(_numIn[0] + 1)].buf.nLen >= 4); + _primROut = _pra[(_numIn[0] + 1)].buf.pv; + _COPY(_in0Len, 0, _primIn, 0, 4); + _praIn = (_pra + 1); + _ASSERT(_nErr, (int)((_praIn[0].buf.nLen / 1)) >= (int)(_in0Len[0])); + _in0[0] = _praIn[0].buf.pv; + _TRY(_nErr, _pfn(*_in0, *_in0Len, _rout1)); + _COPY(_primROut, 0, _rout1, 0, 4); + _CATCH(_nErr) {} + return _nErr; +} +__QAIC_SKEL_EXPORT int __QAIC_SKEL(halide_hexagon_remote_skel_invoke)(uint32_t _sc, remote_arg* _pra) __QAIC_SKEL_ATTRIBUTE { + switch(REMOTE_SCALARS_METHOD(_sc)) + { + case 0: + return _skel_method_7((void*)__QAIC_IMPL(halide_hexagon_remote_initialize_kernels_v3), _sc, _pra); + case 1: + return _skel_method_6((void*)__QAIC_IMPL(halide_hexagon_remote_get_symbol_v4), _sc, _pra); + case 2: + return _skel_method_5((void*)__QAIC_IMPL(halide_hexagon_remote_power_hvx_on), _sc, _pra); + case 3: + return _skel_method_5((void*)__QAIC_IMPL(halide_hexagon_remote_power_hvx_off), _sc, _pra); + case 4: + return _skel_method_4((void*)__QAIC_IMPL(halide_hexagon_remote_run_v2), _sc, _pra); + case 5: + return _skel_method_1((void*)__QAIC_IMPL(halide_hexagon_remote_release_kernels_v2), _sc, _pra); + case 6: + return _skel_method_3((void*)__QAIC_IMPL(halide_hexagon_remote_poll_log), _sc, _pra); + case 7: + return _skel_method_2((void*)__QAIC_IMPL(halide_hexagon_remote_poll_profiler_state), _sc, _pra); + case 8: + return _skel_method_1((void*)__QAIC_IMPL(halide_hexagon_remote_set_performance_mode), _sc, _pra); + case 9: + return _skel_method((void*)__QAIC_IMPL(halide_hexagon_remote_set_performance), _sc, _pra); + } + return AEE_EUNSUPPORTED; +} +#ifdef __cplusplus +} +#endif +#endif //_HALIDE_HEXAGON_REMOTE_SKEL_H diff --git a/src/runtime/hexagon_remote/bin/src/halide_hexagon_remote_stub.c b/src/runtime/hexagon_remote/bin/src/halide_hexagon_remote_stub.c new file mode 100644 index 000000000000..0cb7d241e728 --- /dev/null +++ b/src/runtime/hexagon_remote/bin/src/halide_hexagon_remote_stub.c @@ -0,0 +1,810 @@ +#ifndef _HALIDE_HEXAGON_REMOTE_STUB_H +#define _HALIDE_HEXAGON_REMOTE_STUB_H +#include "halide_hexagon_remote.h" +#ifndef _QAIC_ENV_H +#define _QAIC_ENV_H + +#ifdef __GNUC__ +#ifdef __clang__ +#pragma GCC diagnostic ignored "-Wunknown-pragmas" +#else +#pragma GCC diagnostic ignored "-Wpragmas" +#endif +#pragma GCC diagnostic ignored "-Wuninitialized" +#pragma GCC diagnostic ignored "-Wunused-parameter" +#pragma GCC diagnostic ignored "-Wunused-function" +#endif + +#ifndef _ATTRIBUTE_UNUSED + +#ifdef _WIN32 +#define _ATTRIBUTE_UNUSED +#else +#define _ATTRIBUTE_UNUSED __attribute__ ((unused)) +#endif + +#endif // _ATTRIBUTE_UNUSED + +#ifndef __QAIC_REMOTE +#define __QAIC_REMOTE(ff) ff +#endif //__QAIC_REMOTE + +#ifndef __QAIC_HEADER +#define __QAIC_HEADER(ff) ff +#endif //__QAIC_HEADER + +#ifndef __QAIC_HEADER_EXPORT +#define __QAIC_HEADER_EXPORT +#endif // __QAIC_HEADER_EXPORT + +#ifndef __QAIC_HEADER_ATTRIBUTE +#define __QAIC_HEADER_ATTRIBUTE +#endif // __QAIC_HEADER_ATTRIBUTE + +#ifndef __QAIC_IMPL +#define __QAIC_IMPL(ff) ff +#endif //__QAIC_IMPL + +#ifndef __QAIC_IMPL_EXPORT +#define __QAIC_IMPL_EXPORT +#endif // __QAIC_IMPL_EXPORT + +#ifndef __QAIC_IMPL_ATTRIBUTE +#define __QAIC_IMPL_ATTRIBUTE +#endif // __QAIC_IMPL_ATTRIBUTE + +#ifndef __QAIC_STUB +#define __QAIC_STUB(ff) ff +#endif //__QAIC_STUB + +#ifndef __QAIC_STUB_EXPORT +#define __QAIC_STUB_EXPORT +#endif // __QAIC_STUB_EXPORT + +#ifndef __QAIC_STUB_ATTRIBUTE +#define __QAIC_STUB_ATTRIBUTE +#endif // __QAIC_STUB_ATTRIBUTE + +#ifndef __QAIC_SKEL +#define __QAIC_SKEL(ff) ff +#endif //__QAIC_SKEL__ + +#ifndef __QAIC_SKEL_EXPORT +#define __QAIC_SKEL_EXPORT +#endif // __QAIC_SKEL_EXPORT + +#ifndef __QAIC_SKEL_ATTRIBUTE +#define __QAIC_SKEL_ATTRIBUTE +#endif // __QAIC_SKEL_ATTRIBUTE + +#ifdef __QAIC_DEBUG__ + #ifndef __QAIC_DBG_PRINTF__ + #include + #define __QAIC_DBG_PRINTF__( ee ) do { printf ee ; } while(0) + #endif +#else + #define __QAIC_DBG_PRINTF__( ee ) (void)0 +#endif + + +#define _OFFSET(src, sof) ((void*)(((char*)(src)) + (sof))) + +#define _COPY(dst, dof, src, sof, sz) \ + do {\ + struct __copy { \ + char ar[sz]; \ + };\ + *(struct __copy*)_OFFSET(dst, dof) = *(struct __copy*)_OFFSET(src, sof);\ + } while (0) + +#define _COPYIF(dst, dof, src, sof, sz) \ + do {\ + if(_OFFSET(dst, dof) != _OFFSET(src, sof)) {\ + _COPY(dst, dof, src, sof, sz); \ + } \ + } while (0) + +_ATTRIBUTE_UNUSED +static __inline void _qaic_memmove(void* dst, void* src, int size) { + int i; + for(i = 0; i < size; ++i) { + ((char*)dst)[i] = ((char*)src)[i]; + } +} + +#define _MEMMOVEIF(dst, src, sz) \ + do {\ + if(dst != src) {\ + _qaic_memmove(dst, src, sz);\ + } \ + } while (0) + + +#define _ASSIGN(dst, src, sof) \ + do {\ + dst = OFFSET(src, sof); \ + } while (0) + +#define _STD_STRLEN_IF(str) (str == 0 ? 0 : strlen(str)) + +#include "AEEStdErr.h" + +#define _TRY(ee, func) \ + do { \ + if (AEE_SUCCESS != ((ee) = func)) {\ + __QAIC_DBG_PRINTF__((__FILE__ ":%d:error:%d:%s\n", __LINE__, (int)(ee),#func));\ + goto ee##bail;\ + } \ + } while (0) + +#define _CATCH(exception) exception##bail: if (exception != AEE_SUCCESS) + +#define _ASSERT(nErr, ff) _TRY(nErr, 0 == (ff) ? AEE_EBADPARM : AEE_SUCCESS) + +#ifdef __QAIC_DEBUG__ +#define _ALLOCATE(nErr, pal, size, alignment, pv) _TRY(nErr, _allocator_alloc(pal, __FILE_LINE__, size, alignment, (void**)&pv)) +#else +#define _ALLOCATE(nErr, pal, size, alignment, pv) _TRY(nErr, _allocator_alloc(pal, 0, size, alignment, (void**)&pv)) +#endif + + +#endif // _QAIC_ENV_H + +#include "remote.h" +#ifndef _ALLOCATOR_H +#define _ALLOCATOR_H + +#include +#include + +typedef struct _heap _heap; +struct _heap { + _heap* pPrev; + const char* loc; + uint64_t buf; +}; + +typedef struct _allocator { + _heap* pheap; + uint8_t* stack; + uint8_t* stackEnd; + int nSize; +} _allocator; + +_ATTRIBUTE_UNUSED +static __inline int _heap_alloc(_heap** ppa, const char* loc, int size, void** ppbuf) { + _heap* pn = 0; + pn = malloc(size + sizeof(_heap) - sizeof(uint64_t)); + if(pn != 0) { + pn->pPrev = *ppa; + pn->loc = loc; + *ppa = pn; + *ppbuf = (void*)&(pn->buf); + return 0; + } else { + return -1; + } +} +#define _ALIGN_SIZE(x, y) (((x) + (y-1)) & ~(y-1)) + +_ATTRIBUTE_UNUSED +static __inline int _allocator_alloc(_allocator* me, + const char* loc, + int size, + unsigned int al, + void** ppbuf) { + if(size < 0) { + return -1; + } else if (size == 0) { + *ppbuf = 0; + return 0; + } + if((_ALIGN_SIZE((uintptr_t)me->stackEnd, al) + size) < (uintptr_t)me->stack + me->nSize) { + *ppbuf = (uint8_t*)_ALIGN_SIZE((uintptr_t)me->stackEnd, al); + me->stackEnd = (uint8_t*)_ALIGN_SIZE((uintptr_t)me->stackEnd, al) + size; + return 0; + } else { + return _heap_alloc(&me->pheap, loc, size, ppbuf); + } +} + +_ATTRIBUTE_UNUSED +static __inline void _allocator_deinit(_allocator* me) { + _heap* pa = me->pheap; + while(pa != 0) { + _heap* pn = pa; + const char* loc = pn->loc; + (void)loc; + pa = pn->pPrev; + free(pn); + } +} + +_ATTRIBUTE_UNUSED +static __inline void _allocator_init(_allocator* me, uint8_t* stack, int stackSize) { + me->stack = stack; + me->stackEnd = stack + stackSize; + me->nSize = stackSize; + me->pheap = 0; +} + + +#endif // _ALLOCATOR_H + +#ifndef SLIM_H +#define SLIM_H + +#include + +//a C data structure for the idl types that can be used to implement +//static and dynamic language bindings fairly efficiently. +// +//the goal is to have a minimal ROM and RAM footprint and without +//doing too many allocations. A good way to package these things seemed +//like the module boundary, so all the idls within one module can share +//all the type references. + + +#define PARAMETER_IN 0x0 +#define PARAMETER_OUT 0x1 +#define PARAMETER_INOUT 0x2 +#define PARAMETER_ROUT 0x3 +#define PARAMETER_INROUT 0x4 + +//the types that we get from idl +#define TYPE_OBJECT 0x0 +#define TYPE_INTERFACE 0x1 +#define TYPE_PRIMITIVE 0x2 +#define TYPE_ENUM 0x3 +#define TYPE_STRING 0x4 +#define TYPE_WSTRING 0x5 +#define TYPE_STRUCTURE 0x6 +#define TYPE_UNION 0x7 +#define TYPE_ARRAY 0x8 +#define TYPE_SEQUENCE 0x9 + +//these require the pack/unpack to recurse +//so it's a hint to those languages that can optimize in cases where +//recursion isn't necessary. +#define TYPE_COMPLEX_STRUCTURE (0x10 | TYPE_STRUCTURE) +#define TYPE_COMPLEX_UNION (0x10 | TYPE_UNION) +#define TYPE_COMPLEX_ARRAY (0x10 | TYPE_ARRAY) +#define TYPE_COMPLEX_SEQUENCE (0x10 | TYPE_SEQUENCE) + + +typedef struct Type Type; + +#define INHERIT_TYPE\ + int32_t nativeSize; /*in the simple case its the same as wire size and alignment*/\ + union {\ + struct {\ + const uintptr_t p1;\ + const uintptr_t p2;\ + } _cast;\ + struct {\ + uint32_t iid;\ + uint32_t bNotNil;\ + } object;\ + struct {\ + const Type *arrayType;\ + int32_t nItems;\ + } array;\ + struct {\ + const Type *seqType;\ + int32_t nMaxLen;\ + } seqSimple; \ + struct {\ + uint32_t bFloating;\ + uint32_t bSigned;\ + } prim; \ + const SequenceType* seqComplex;\ + const UnionType *unionType;\ + const StructType *structType;\ + int32_t stringMaxLen;\ + uint8_t bInterfaceNotNil;\ + } param;\ + uint8_t type;\ + uint8_t nativeAlignment\ + +typedef struct UnionType UnionType; +typedef struct StructType StructType; +typedef struct SequenceType SequenceType; +struct Type { + INHERIT_TYPE; +}; + +struct SequenceType { + const Type * seqType; + uint32_t nMaxLen; + uint32_t inSize; + uint32_t routSizePrimIn; + uint32_t routSizePrimROut; +}; + +//byte offset from the start of the case values for +//this unions case value array. it MUST be aligned +//at the alignment requrements for the descriptor +// +//if negative it means that the unions cases are +//simple enumerators, so the value read from the descriptor +//can be used directly to find the correct case +typedef union CaseValuePtr CaseValuePtr; +union CaseValuePtr { + const uint8_t* value8s; + const uint16_t* value16s; + const uint32_t* value32s; + const uint64_t* value64s; +}; + +//these are only used in complex cases +//so I pulled them out of the type definition as references to make +//the type smaller +struct UnionType { + const Type *descriptor; + uint32_t nCases; + const CaseValuePtr caseValues; + const Type * const *cases; + int32_t inSize; + int32_t routSizePrimIn; + int32_t routSizePrimROut; + uint8_t inAlignment; + uint8_t routAlignmentPrimIn; + uint8_t routAlignmentPrimROut; + uint8_t inCaseAlignment; + uint8_t routCaseAlignmentPrimIn; + uint8_t routCaseAlignmentPrimROut; + uint8_t nativeCaseAlignment; + uint8_t bDefaultCase; +}; + +struct StructType { + uint32_t nMembers; + const Type * const *members; + int32_t inSize; + int32_t routSizePrimIn; + int32_t routSizePrimROut; + uint8_t inAlignment; + uint8_t routAlignmentPrimIn; + uint8_t routAlignmentPrimROut; +}; + +typedef struct Parameter Parameter; +struct Parameter { + INHERIT_TYPE; + uint8_t mode; + uint8_t bNotNil; +}; + +#define SLIM_IFPTR32(is32,is64) (sizeof(uintptr_t) == 4 ? (is32) : (is64)) +#define SLIM_SCALARS_IS_DYNAMIC(u) (((u) & 0x00ffffff) == 0x00ffffff) + +typedef struct Method Method; +struct Method { + uint32_t uScalars; //no method index + int32_t primInSize; + int32_t primROutSize; + int maxArgs; + int numParams; + const Parameter * const *params; + uint8_t primInAlignment; + uint8_t primROutAlignment; +}; + +typedef struct Interface Interface; + +struct Interface { + int nMethods; + const Method * const *methodArray; + int nIIds; + const uint32_t *iids; + const uint16_t* methodStringArray; + const uint16_t* methodStrings; + const char* strings; +}; + + +#endif //SLIM_H + + +#ifndef _HALIDE_HEXAGON_REMOTE_SLIM_H +#define _HALIDE_HEXAGON_REMOTE_SLIM_H +#include "remote.h" +#include + +#ifndef __QAIC_SLIM +#define __QAIC_SLIM(ff) ff +#endif +#ifndef __QAIC_SLIM_EXPORT +#define __QAIC_SLIM_EXPORT +#endif + +static const Type types[2]; +static const SequenceType sequenceTypes[1] = {{&(types[1]),0x0,0x4,0x4,0x0}}; +static const Type types[2] = {{0x1,{{(const uintptr_t)0,(const uintptr_t)0}}, 2,0x1},{SLIM_IFPTR32(0x8,0x10),{{(const uintptr_t)&(types[0]),(const uintptr_t)0x0}}, 9,SLIM_IFPTR32(0x4,0x8)}}; +static const Parameter parameters[8] = {{SLIM_IFPTR32(0x8,0x10),{{(const uintptr_t)&(types[0]),(const uintptr_t)0x0}}, 9,SLIM_IFPTR32(0x4,0x8),0,0},{0x4,{{(const uintptr_t)0,(const uintptr_t)0}}, 2,0x4,3,0},{0x4,{{(const uintptr_t)0,(const uintptr_t)0}}, 2,0x4,0,0},{SLIM_IFPTR32(0x8,0x10),{{(const uintptr_t)&(sequenceTypes[0]),0}}, 25,SLIM_IFPTR32(0x4,0x8),0,0},{SLIM_IFPTR32(0x8,0x10),{{(const uintptr_t)&(sequenceTypes[0]),0}}, 25,SLIM_IFPTR32(0x4,0x8),3,0},{0x4,{{(const uintptr_t)0,(const uintptr_t)1}}, 2,0x4,0,0},{SLIM_IFPTR32(0x8,0x10),{{(const uintptr_t)&(types[0]),(const uintptr_t)0x0}}, 9,SLIM_IFPTR32(0x4,0x8),3,0},{0x4,{{(const uintptr_t)0,(const uintptr_t)1}}, 2,0x4,3,0}}; +static const Parameter* const parameterArrays[21] = {(&(parameters[5])),(&(parameters[2])),(&(parameters[2])),(&(parameters[5])),(&(parameters[2])),(&(parameters[2])),(&(parameters[5])),(&(parameters[5])),(&(parameters[2])),(&(parameters[2])),(&(parameters[3])),(&(parameters[4])),(&(parameters[5])),(&(parameters[0])),(&(parameters[2])),(&(parameters[0])),(&(parameters[1])),(&(parameters[7])),(&(parameters[7])),(&(parameters[6])),(&(parameters[7]))}; +static const Method methods[9] = {{REMOTE_SCALARS_MAKEX(0,0,0x2,0x1,0x0,0x0),0x4,0x4,3,2,(&(parameterArrays[15])),0x4,0x4},{REMOTE_SCALARS_MAKEX(0,0,0x2,0x1,0x0,0x0),0x8,0x4,4,3,(&(parameterArrays[14])),0x4,0x4},{REMOTE_SCALARS_MAKEX(0,0,0x0,0x0,0x0,0x0),0x0,0x0,0,0,0,0x0,0x0},{REMOTE_SCALARS_MAKEX(0,0,255,255,15,15),0x18,0x0,10,6,(&(parameterArrays[8])),0x4,0x1},{REMOTE_SCALARS_MAKEX(0,0,0x1,0x0,0x0,0x0),0x4,0x0,1,1,(&(parameterArrays[1])),0x4,0x0},{REMOTE_SCALARS_MAKEX(0,0,0x1,0x2,0x0,0x0),0x4,0x4,4,2,(&(parameterArrays[19])),0x4,0x4},{REMOTE_SCALARS_MAKEX(0,0,0x0,0x1,0x0,0x0),0x0,0x8,2,2,(&(parameterArrays[17])),0x1,0x4},{REMOTE_SCALARS_MAKEX(0,0,0x1,0x0,0x0,0x0),0x4,0x0,1,1,(&(parameterArrays[0])),0x4,0x0},{REMOTE_SCALARS_MAKEX(0,0,0x1,0x0,0x0,0x0),0x20,0x0,8,8,(&(parameterArrays[0])),0x4,0x0}}; +static const Method* const methodArrays[10] = {&(methods[0]),&(methods[1]),&(methods[2]),&(methods[2]),&(methods[3]),&(methods[4]),&(methods[5]),&(methods[6]),&(methods[7]),&(methods[8])}; +static const char strings[357] = "initialize_kernels_v3\0busbwUsagePercentage\0set_performance_mode\0poll_profiler_state\0release_kernels_v2\0bwMegabytesPerSec\0set_performance\0output_buffers\0mipsPerThread\0input_buffers\0power_hvx_off\0get_symbol_v4\0scalar_count\0power_hvx_on\0set_latency\0set_bus_bw\0module_ptr\0mipsTotal\0read_size\0set_mips\0poll_log\0threads\0sym_ptr\0symbol\0run_v2\0small\0func\0name\0code\0"; +static const uint16_t methodStrings[35] = {121,288,152,268,246,103,22,234,238,329,257,322,166,137,208,336,194,257,347,314,64,342,306,297,302,278,0,352,257,43,59,84,257,180,221}; +static const uint16_t methodStringsArrays[10] = {26,16,34,33,9,31,23,20,29,0}; +__QAIC_SLIM_EXPORT const Interface __QAIC_SLIM(halide_hexagon_remote_slim) = {10,&(methodArrays[0]),0,0,&(methodStringsArrays [0]),methodStrings,strings}; +#endif //_HALIDE_HEXAGON_REMOTE_SLIM_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _const_halide_hexagon_remote_handle +#define _const_halide_hexagon_remote_handle ((remote_handle)-1) +#endif //_const_halide_hexagon_remote_handle + +static void _halide_hexagon_remote_pls_dtor(void* data) { + remote_handle* ph = (remote_handle*)data; + if(_const_halide_hexagon_remote_handle != *ph) { + (void)__QAIC_REMOTE(remote_handle_close)(*ph); + *ph = _const_halide_hexagon_remote_handle; + } +} + +static int _halide_hexagon_remote_pls_ctor(void* ctx, void* data) { + remote_handle* ph = (remote_handle*)data; + *ph = _const_halide_hexagon_remote_handle; + if(*ph == (remote_handle)-1) { + return __QAIC_REMOTE(remote_handle_open)((const char*)ctx, ph); + } + return 0; +} + +#if (defined __qdsp6__) || (defined __hexagon__) +#pragma weak adsp_pls_add_lookup +extern int adsp_pls_add_lookup(uint32_t type, uint32_t key, int size, int (*ctor)(void* ctx, void* data), void* ctx, void (*dtor)(void* ctx), void** ppo); +#pragma weak HAP_pls_add_lookup +extern int HAP_pls_add_lookup(uint32_t type, uint32_t key, int size, int (*ctor)(void* ctx, void* data), void* ctx, void (*dtor)(void* ctx), void** ppo); + +__QAIC_STUB_EXPORT remote_handle _halide_hexagon_remote_handle(void) { + remote_handle* ph; + if(adsp_pls_add_lookup) { + if(0 == adsp_pls_add_lookup((uint32_t)_halide_hexagon_remote_handle, 0, sizeof(*ph), _halide_hexagon_remote_pls_ctor, "halide_hexagon_remote", _halide_hexagon_remote_pls_dtor, (void**)&ph)) { + return *ph; + } + return (remote_handle)-1; + } else if(HAP_pls_add_lookup) { + if(0 == HAP_pls_add_lookup((uint32_t)_halide_hexagon_remote_handle, 0, sizeof(*ph), _halide_hexagon_remote_pls_ctor, "halide_hexagon_remote", _halide_hexagon_remote_pls_dtor, (void**)&ph)) { + return *ph; + } + return (remote_handle)-1; + } + return(remote_handle)-1; +} + +#else //__qdsp6__ || __hexagon__ + +uint32_t _halide_hexagon_remote_atomic_CompareAndExchange(uint32_t * volatile puDest, uint32_t uExchange, uint32_t uCompare); + +#ifdef _WIN32 +#include "Windows.h" +uint32_t _halide_hexagon_remote_atomic_CompareAndExchange(uint32_t * volatile puDest, uint32_t uExchange, uint32_t uCompare) { + return (uint32_t)InterlockedCompareExchange((volatile LONG*)puDest, (LONG)uExchange, (LONG)uCompare); +} +#elif __GNUC__ +uint32_t _halide_hexagon_remote_atomic_CompareAndExchange(uint32_t * volatile puDest, uint32_t uExchange, uint32_t uCompare) { + return __sync_val_compare_and_swap(puDest, uCompare, uExchange); +} +#endif //_WIN32 + + +__QAIC_STUB_EXPORT remote_handle _halide_hexagon_remote_handle(void) { + static remote_handle handle = _const_halide_hexagon_remote_handle; + if((remote_handle)-1 != handle) { + return handle; + } else { + remote_handle tmp; + int nErr = _halide_hexagon_remote_pls_ctor("halide_hexagon_remote", (void*)&tmp); + if(nErr) { + return (remote_handle)-1; + } + if(((remote_handle)-1 != handle) || ((remote_handle)-1 != (remote_handle)_halide_hexagon_remote_atomic_CompareAndExchange((uint32_t*)&handle, (uint32_t)tmp, (uint32_t)-1))) { + _halide_hexagon_remote_pls_dtor(&tmp); + } + return handle; + } +} + +#endif //__qdsp6__ + +int remote_register_dma_handle(int, uint32_t); + +__QAIC_STUB_EXPORT int __QAIC_STUB(halide_hexagon_remote_skel_invoke)(uint32_t _sc, remote_arg* _pra) __QAIC_STUB_ATTRIBUTE { + return __QAIC_REMOTE(remote_handle_invoke)(_halide_hexagon_remote_handle(), _sc, _pra); +} + +#ifdef __cplusplus +} +#endif + + +#ifdef __cplusplus +extern "C" { +#endif +static __inline int _stub_method(remote_handle _handle, uint32_t _mid, char* _in0[1], uint32_t _in0Len[1], uint32_t _rout1[1]) { + int _numIn[1]; + remote_arg _pra[3]; + uint32_t _primIn[1]; + uint32_t _primROut[1]; + remote_arg* _praIn; + int _nErr = 0; + _numIn[0] = 1; + _pra[0].buf.pv = (void*)_primIn; + _pra[0].buf.nLen = sizeof(_primIn); + _pra[(_numIn[0] + 1)].buf.pv = (void*)_primROut; + _pra[(_numIn[0] + 1)].buf.nLen = sizeof(_primROut); + _COPY(_primIn, 0, _in0Len, 0, 4); + _praIn = (_pra + 1); + _praIn[0].buf.pv = _in0[0]; + _praIn[0].buf.nLen = (1 * _in0Len[0]); + _TRY(_nErr, __QAIC_REMOTE(remote_handle_invoke)(_handle, REMOTE_SCALARS_MAKEX(0, _mid, 2, 1, 0, 0), _pra)); + _COPY(_rout1, 0, _primROut, 0, 4); + _CATCH(_nErr) {} + return _nErr; +} +__QAIC_STUB_EXPORT int __QAIC_STUB(halide_hexagon_remote_initialize_kernels_v3)(const unsigned char* code, int codeLen, halide_hexagon_remote_handle_t* module_ptr) __QAIC_STUB_ATTRIBUTE { + uint32_t _mid = 0; + return _stub_method(_halide_hexagon_remote_handle(), _mid, (char**)&code, (uint32_t*)&codeLen, (uint32_t*)module_ptr); +} +static __inline int _stub_method_1(remote_handle _handle, uint32_t _mid, uint32_t _in0[1], char* _in1[1], uint32_t _in1Len[1], uint32_t _rout2[1]) { + int _numIn[1]; + remote_arg _pra[3]; + uint32_t _primIn[2]; + uint32_t _primROut[1]; + remote_arg* _praIn; + int _nErr = 0; + _numIn[0] = 1; + _pra[0].buf.pv = (void*)_primIn; + _pra[0].buf.nLen = sizeof(_primIn); + _pra[(_numIn[0] + 1)].buf.pv = (void*)_primROut; + _pra[(_numIn[0] + 1)].buf.nLen = sizeof(_primROut); + _COPY(_primIn, 0, _in0, 0, 4); + _COPY(_primIn, 4, _in1Len, 0, 4); + _praIn = (_pra + 1); + _praIn[0].buf.pv = _in1[0]; + _praIn[0].buf.nLen = (1 * _in1Len[0]); + _TRY(_nErr, __QAIC_REMOTE(remote_handle_invoke)(_handle, REMOTE_SCALARS_MAKEX(0, _mid, 2, 1, 0, 0), _pra)); + _COPY(_rout2, 0, _primROut, 0, 4); + _CATCH(_nErr) {} + return _nErr; +} +__QAIC_STUB_EXPORT int __QAIC_STUB(halide_hexagon_remote_get_symbol_v4)(halide_hexagon_remote_handle_t module_ptr, const char* name, int nameLen, halide_hexagon_remote_handle_t* sym_ptr) __QAIC_STUB_ATTRIBUTE { + uint32_t _mid = 1; + return _stub_method_1(_halide_hexagon_remote_handle(), _mid, (uint32_t*)&module_ptr, (char**)&name, (uint32_t*)&nameLen, (uint32_t*)sym_ptr); +} +static __inline int _stub_method_2(remote_handle _handle, uint32_t _mid) { + remote_arg* _pra = 0; + int _nErr = 0; + _TRY(_nErr, __QAIC_REMOTE(remote_handle_invoke)(_handle, REMOTE_SCALARS_MAKEX(0, _mid, 0, 0, 0, 0), _pra)); + _CATCH(_nErr) {} + return _nErr; +} +__QAIC_STUB_EXPORT int __QAIC_STUB(halide_hexagon_remote_power_hvx_on)(void) __QAIC_STUB_ATTRIBUTE { + uint32_t _mid = 2; + return _stub_method_2(_halide_hexagon_remote_handle(), _mid); +} +__QAIC_STUB_EXPORT int __QAIC_STUB(halide_hexagon_remote_power_hvx_off)(void) __QAIC_STUB_ATTRIBUTE { + uint32_t _mid = 3; + return _stub_method_2(_halide_hexagon_remote_handle(), _mid); +} +static __inline int _stub_unpack(remote_arg* _praROutPost, remote_arg* _ppraROutPost[1], void* _primROut, char* _rout0[1], uint32_t _rout0Len[1]) { + int _nErr = 0; + remote_arg* _praROutPostStart = _praROutPost; + remote_arg** _ppraROutPostStart = _ppraROutPost; + _ppraROutPost = &_praROutPost; + _ppraROutPostStart[0] += (_praROutPost - _praROutPostStart) +1; + return _nErr; +} +static __inline int _stub_unpack_1(remote_arg* _praROutPost, remote_arg* _ppraROutPost[1], void* _primROut, char* _in0[1], uint32_t _in0Len[1]) { + int _nErr = 0; + remote_arg* _praROutPostStart = _praROutPost; + remote_arg** _ppraROutPostStart = _ppraROutPost; + _ppraROutPost = &_praROutPost; + _ppraROutPostStart[0] += (_praROutPost - _praROutPostStart) +0; + return _nErr; +} +static __inline int _stub_pack(_allocator* _al, remote_arg* _praIn, remote_arg* _ppraIn[1], remote_arg* _praROut, remote_arg* _ppraROut[1], void* _primIn, void* _primROut, char* _rout0[1], uint32_t _rout0Len[1]) { + int _nErr = 0; + remote_arg* _praInStart = _praIn; + remote_arg** _ppraInStart = _ppraIn; + remote_arg* _praROutStart = _praROut; + remote_arg** _ppraROutStart = _ppraROut; + _ppraIn = &_praIn; + _ppraROut = &_praROut; + _COPY(_primIn, 0, _rout0Len, 0, 4); + _praROut[0].buf.pv = _rout0[0]; + _praROut[0].buf.nLen = (1 * _rout0Len[0]); + _ppraInStart[0] += (_praIn - _praInStart) + 0; + _ppraROutStart[0] += (_praROut - _praROutStart) +1; + return _nErr; +} +static __inline int _stub_pack_1(_allocator* _al, remote_arg* _praIn, remote_arg* _ppraIn[1], remote_arg* _praROut, remote_arg* _ppraROut[1], void* _primIn, void* _primROut, char* _in0[1], uint32_t _in0Len[1]) { + int _nErr = 0; + remote_arg* _praInStart = _praIn; + remote_arg** _ppraInStart = _ppraIn; + remote_arg* _praROutStart = _praROut; + remote_arg** _ppraROutStart = _ppraROut; + _ppraIn = &_praIn; + _ppraROut = &_praROut; + _COPY(_primIn, 0, _in0Len, 0, 4); + _praIn[0].buf.pv = _in0[0]; + _praIn[0].buf.nLen = (1 * _in0Len[0]); + _ppraInStart[0] += (_praIn - _praInStart) + 1; + _ppraROutStart[0] += (_praROut - _praROutStart) +0; + return _nErr; +} +static __inline void _count(int _numIn[1], int _numROut[1], char* _rout0[1], uint32_t _rout0Len[1]) { + _numIn[0] += 0; + _numROut[0] += 1; +} +static __inline void _count_1(int _numIn[1], int _numROut[1], char* _in0[1], uint32_t _in0Len[1]) { + _numIn[0] += 1; + _numROut[0] += 0; +} +static __inline int _stub_method_3(remote_handle _handle, uint32_t _mid, uint32_t _in0[1], uint32_t _in1[1], void* _in2[1], uint32_t _in2Len[1], void* _rout3[1], uint32_t _rout3Len[1], uint32_t _in4[1], char* _in5[1], uint32_t _in5Len[1]) { + remote_arg* _pra; + int _numIn[1]; + int _numROut[1]; + char* _seq_nat2; + int _ii; + char* _seq_nat3; + _allocator _al[1] = {{0}}; + uint32_t _primIn[6]; + remote_arg* _praIn; + remote_arg* _praROut; + remote_arg* _praROutPost; + remote_arg** _ppraROutPost = &_praROutPost; + remote_arg** _ppraIn = &_praIn; + remote_arg** _ppraROut = &_praROut; + char* _seq_primIn2; + int _nErr = 0; + char* _seq_primIn3; + _numIn[0] = 3; + _numROut[0] = 0; + for(_ii = 0, _seq_nat2 = (char*)_in2[0];_ii < (int)_in2Len[0];++_ii, _seq_nat2 = (_seq_nat2 + SLIM_IFPTR32(8, 16))) + { + _count_1(_numIn, _numROut, SLIM_IFPTR32((char**)&(((uint32_t*)_seq_nat2)[0]), (char**)&(((uint64_t*)_seq_nat2)[0])), SLIM_IFPTR32((uint32_t*)&(((uint32_t*)_seq_nat2)[1]), (uint32_t*)&(((uint32_t*)_seq_nat2)[2]))); + } + for(_ii = 0, _seq_nat3 = (char*)_rout3[0];_ii < (int)_rout3Len[0];++_ii, _seq_nat3 = (_seq_nat3 + SLIM_IFPTR32(8, 16))) + { + _count(_numIn, _numROut, SLIM_IFPTR32((char**)&(((uint32_t*)_seq_nat3)[0]), (char**)&(((uint64_t*)_seq_nat3)[0])), SLIM_IFPTR32((uint32_t*)&(((uint32_t*)_seq_nat3)[1]), (uint32_t*)&(((uint32_t*)_seq_nat3)[2]))); + } + _allocator_init(_al, 0, 0); + _ALLOCATE(_nErr, _al, ((((_numIn[0] + _numROut[0]) + 1) + 0) * sizeof(_pra[0])), 4, _pra); + _pra[0].buf.pv = (void*)_primIn; + _pra[0].buf.nLen = sizeof(_primIn); + _praIn = (_pra + 1); + _praROut = (_praIn + _numIn[0] + 0); + _praROutPost = _praROut; + _COPY(_primIn, 0, _in0, 0, 4); + _COPY(_primIn, 4, _in1, 0, 4); + _COPY(_primIn, 8, _in2Len, 0, 4); + _ALLOCATE(_nErr, _al, (_in2Len[0] * 4), 4, _praIn[0].buf.pv); + _praIn[0].buf.nLen = (4 * _in2Len[0]); + for(_ii = 0, _seq_primIn2 = (char*)_praIn[0].buf.pv, _seq_nat2 = (char*)_in2[0];_ii < (int)_in2Len[0];++_ii, _seq_primIn2 = (_seq_primIn2 + 4), _seq_nat2 = (_seq_nat2 + SLIM_IFPTR32(8, 16))) + { + _TRY(_nErr, _stub_pack_1(_al, (_praIn + 1), _ppraIn, (_praROut + 0), _ppraROut, _seq_primIn2, 0, SLIM_IFPTR32((char**)&(((uint32_t*)_seq_nat2)[0]), (char**)&(((uint64_t*)_seq_nat2)[0])), SLIM_IFPTR32((uint32_t*)&(((uint32_t*)_seq_nat2)[1]), (uint32_t*)&(((uint32_t*)_seq_nat2)[2])))); + } + _COPY(_primIn, 12, _rout3Len, 0, 4); + _ALLOCATE(_nErr, _al, (_rout3Len[0] * 4), 4, _praIn[1].buf.pv); + _praIn[1].buf.nLen = (4 * _rout3Len[0]); + for(_ii = 0, _seq_primIn3 = (char*)_praIn[1].buf.pv, _seq_nat3 = (char*)_rout3[0];_ii < (int)_rout3Len[0];++_ii, _seq_primIn3 = (_seq_primIn3 + 4), _seq_nat3 = (_seq_nat3 + SLIM_IFPTR32(8, 16))) + { + _TRY(_nErr, _stub_pack(_al, (_praIn + 2), _ppraIn, (_praROut + 0), _ppraROut, _seq_primIn3, 0, SLIM_IFPTR32((char**)&(((uint32_t*)_seq_nat3)[0]), (char**)&(((uint64_t*)_seq_nat3)[0])), SLIM_IFPTR32((uint32_t*)&(((uint32_t*)_seq_nat3)[1]), (uint32_t*)&(((uint32_t*)_seq_nat3)[2])))); + } + _COPY(_primIn, 16, _in4, 0, 4); + _COPY(_primIn, 20, _in5Len, 0, 4); + _praIn[2].buf.pv = _in5[0]; + _praIn[2].buf.nLen = (1 * _in5Len[0]); + _TRY(_nErr, __QAIC_REMOTE(remote_handle_invoke)(_handle, REMOTE_SCALARS_MAKEX(0, _mid, (_numIn[0] + 1), (_numROut[0] + 0), 0, 0), _pra)); + for(_ii = 0, _seq_nat2 = (char*)_in2[0];_ii < (int)_in2Len[0];++_ii, _seq_nat2 = (_seq_nat2 + SLIM_IFPTR32(8, 16))) + { + _TRY(_nErr, _stub_unpack_1((_praROutPost + 0), _ppraROutPost, 0, SLIM_IFPTR32((char**)&(((uint32_t*)_seq_nat2)[0]), (char**)&(((uint64_t*)_seq_nat2)[0])), SLIM_IFPTR32((uint32_t*)&(((uint32_t*)_seq_nat2)[1]), (uint32_t*)&(((uint32_t*)_seq_nat2)[2])))); + } + for(_ii = 0, _seq_nat3 = (char*)_rout3[0];_ii < (int)_rout3Len[0];++_ii, _seq_nat3 = (_seq_nat3 + SLIM_IFPTR32(8, 16))) + { + _TRY(_nErr, _stub_unpack((_praROutPost + 0), _ppraROutPost, 0, SLIM_IFPTR32((char**)&(((uint32_t*)_seq_nat3)[0]), (char**)&(((uint64_t*)_seq_nat3)[0])), SLIM_IFPTR32((uint32_t*)&(((uint32_t*)_seq_nat3)[1]), (uint32_t*)&(((uint32_t*)_seq_nat3)[2])))); + } + _CATCH(_nErr) {} + _allocator_deinit(_al); + return _nErr; +} +__QAIC_STUB_EXPORT int __QAIC_STUB(halide_hexagon_remote_run_v2)(halide_hexagon_remote_handle_t module_ptr, halide_hexagon_remote_handle_t symbol, const halide_hexagon_remote_buffer* input_buffers, int input_buffersLen, halide_hexagon_remote_buffer* output_buffers, int output_buffersLen, int scalar_count, const unsigned char* small, int smallLen) __QAIC_STUB_ATTRIBUTE { + uint32_t _mid = 4; + return _stub_method_3(_halide_hexagon_remote_handle(), _mid, (uint32_t*)&module_ptr, (uint32_t*)&symbol, (void**)&input_buffers, (uint32_t*)&input_buffersLen, (void**)&output_buffers, (uint32_t*)&output_buffersLen, (uint32_t*)&scalar_count, (char**)&small, (uint32_t*)&smallLen); +} +static __inline int _stub_method_4(remote_handle _handle, uint32_t _mid, uint32_t _in0[1]) { + remote_arg _pra[1]; + uint32_t _primIn[1]; + int _nErr = 0; + _pra[0].buf.pv = (void*)_primIn; + _pra[0].buf.nLen = sizeof(_primIn); + _COPY(_primIn, 0, _in0, 0, 4); + _TRY(_nErr, __QAIC_REMOTE(remote_handle_invoke)(_handle, REMOTE_SCALARS_MAKEX(0, _mid, 1, 0, 0, 0), _pra)); + _CATCH(_nErr) {} + return _nErr; +} +__QAIC_STUB_EXPORT int __QAIC_STUB(halide_hexagon_remote_release_kernels_v2)(halide_hexagon_remote_handle_t module_ptr) __QAIC_STUB_ATTRIBUTE { + uint32_t _mid = 5; + return _stub_method_4(_halide_hexagon_remote_handle(), _mid, (uint32_t*)&module_ptr); +} +static __inline int _stub_method_5(remote_handle _handle, uint32_t _mid, char* _rout0[1], uint32_t _rout0Len[1], uint32_t _rout1[1]) { + int _numIn[1]; + remote_arg _pra[3]; + uint32_t _primIn[1]; + uint32_t _primROut[1]; + remote_arg* _praIn; + remote_arg* _praROut; + int _nErr = 0; + _numIn[0] = 0; + _pra[0].buf.pv = (void*)_primIn; + _pra[0].buf.nLen = sizeof(_primIn); + _pra[(_numIn[0] + 1)].buf.pv = (void*)_primROut; + _pra[(_numIn[0] + 1)].buf.nLen = sizeof(_primROut); + _COPY(_primIn, 0, _rout0Len, 0, 4); + _praIn = (_pra + 1); + _praROut = (_praIn + _numIn[0] + 1); + _praROut[0].buf.pv = _rout0[0]; + _praROut[0].buf.nLen = (1 * _rout0Len[0]); + _TRY(_nErr, __QAIC_REMOTE(remote_handle_invoke)(_handle, REMOTE_SCALARS_MAKEX(0, _mid, 1, 2, 0, 0), _pra)); + _COPY(_rout1, 0, _primROut, 0, 4); + _CATCH(_nErr) {} + return _nErr; +} +__QAIC_STUB_EXPORT int __QAIC_STUB(halide_hexagon_remote_poll_log)(char* log, int logLen, int* read_size) __QAIC_STUB_ATTRIBUTE { + uint32_t _mid = 6; + return _stub_method_5(_halide_hexagon_remote_handle(), _mid, (char**)&log, (uint32_t*)&logLen, (uint32_t*)read_size); +} +static __inline int _stub_method_6(remote_handle _handle, uint32_t _mid, uint32_t _rout0[1], uint32_t _rout1[1]) { + int _numIn[1]; + remote_arg _pra[1]; + uint32_t _primROut[2]; + int _nErr = 0; + _numIn[0] = 0; + _pra[(_numIn[0] + 0)].buf.pv = (void*)_primROut; + _pra[(_numIn[0] + 0)].buf.nLen = sizeof(_primROut); + _TRY(_nErr, __QAIC_REMOTE(remote_handle_invoke)(_handle, REMOTE_SCALARS_MAKEX(0, _mid, 0, 1, 0, 0), _pra)); + _COPY(_rout0, 0, _primROut, 0, 4); + _COPY(_rout1, 0, _primROut, 4, 4); + _CATCH(_nErr) {} + return _nErr; +} +__QAIC_STUB_EXPORT int __QAIC_STUB(halide_hexagon_remote_poll_profiler_state)(int* func, int* threads) __QAIC_STUB_ATTRIBUTE { + uint32_t _mid = 7; + return _stub_method_6(_halide_hexagon_remote_handle(), _mid, (uint32_t*)func, (uint32_t*)threads); +} +__QAIC_STUB_EXPORT int __QAIC_STUB(halide_hexagon_remote_set_performance_mode)(int mode) __QAIC_STUB_ATTRIBUTE { + uint32_t _mid = 8; + return _stub_method_4(_halide_hexagon_remote_handle(), _mid, (uint32_t*)&mode); +} +static __inline int _stub_method_7(remote_handle _handle, uint32_t _mid, uint32_t _in0[1], uint32_t _in1[1], uint32_t _in2[1], uint32_t _in3[1], uint32_t _in4[1], uint32_t _in5[1], uint32_t _in6[1], uint32_t _in7[1]) { + remote_arg _pra[1]; + uint32_t _primIn[8]; + int _nErr = 0; + _pra[0].buf.pv = (void*)_primIn; + _pra[0].buf.nLen = sizeof(_primIn); + _COPY(_primIn, 0, _in0, 0, 4); + _COPY(_primIn, 4, _in1, 0, 4); + _COPY(_primIn, 8, _in2, 0, 4); + _COPY(_primIn, 12, _in3, 0, 4); + _COPY(_primIn, 16, _in4, 0, 4); + _COPY(_primIn, 20, _in5, 0, 4); + _COPY(_primIn, 24, _in6, 0, 4); + _COPY(_primIn, 28, _in7, 0, 4); + _TRY(_nErr, __QAIC_REMOTE(remote_handle_invoke)(_handle, REMOTE_SCALARS_MAKEX(0, _mid, 1, 0, 0, 0), _pra)); + _CATCH(_nErr) {} + return _nErr; +} +__QAIC_STUB_EXPORT int __QAIC_STUB(halide_hexagon_remote_set_performance)(int set_mips, unsigned int mipsPerThread, unsigned int mipsTotal, int set_bus_bw, unsigned int bwMegabytesPerSec, unsigned int busbwUsagePercentage, int set_latency, int latency) __QAIC_STUB_ATTRIBUTE { + uint32_t _mid = 9; + return _stub_method_7(_halide_hexagon_remote_handle(), _mid, (uint32_t*)&set_mips, (uint32_t*)&mipsPerThread, (uint32_t*)&mipsTotal, (uint32_t*)&set_bus_bw, (uint32_t*)&bwMegabytesPerSec, (uint32_t*)&busbwUsagePercentage, (uint32_t*)&set_latency, (uint32_t*)&latency); +} +#ifdef __cplusplus +} +#endif +#endif //_HALIDE_HEXAGON_REMOTE_STUB_H diff --git a/src/runtime/hexagon_remote/bin/v60/hexagon_sim_remote b/src/runtime/hexagon_remote/bin/v60/hexagon_sim_remote new file mode 100755 index 0000000000000000000000000000000000000000..be4c233fab143b4b39c49236cd83b89092500a4d GIT binary patch literal 521504 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 z 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

YV6{{Uqgtu0h|veNS@RrjyBSc{LM#+D}YK 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 z

    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 L?{Fji%l-WyL%whp literal 0 HcmV?d00001 diff --git a/src/runtime/hexagon_remote/bin/v60/libhalide_hexagon_remote_skel.so b/src/runtime/hexagon_remote/bin/v60/libhalide_hexagon_remote_skel.so new file mode 100755 index 0000000000000000000000000000000000000000..2b3d2a1760094474945ae58830c865b5335c92d3 GIT binary patch literal 32504 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 W$*%7q8s$CNhUeQ?AX5vvy#EVyfA*6A literal 0 HcmV?d00001 diff --git a/src/runtime/hexagon_remote/bin/v60/signed_by_debug/libhalide_hexagon_remote_skel.so b/src/runtime/hexagon_remote/bin/v60/signed_by_debug/libhalide_hexagon_remote_skel.so new file mode 100644 index 0000000000000000000000000000000000000000..0824f3896db5dcf76c10b575be804adb4ccfe7da GIT binary patch literal 37888 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 RF9N+#xws>z@37JJKLEJ*ijx2U literal 0 HcmV?d00001 From 90f57edfac0f702feae164113d0d6e7907043f6f Mon Sep 17 00:00:00 2001 From: dsharletg Date: Wed, 12 Jul 2017 09:21:22 -0700 Subject: [PATCH 5/7] Add more comments and error checking. --- .../arm-32-android/libhalide_hexagon_host.so | Bin 79584 -> 79584 bytes .../arm-64-android/libhalide_hexagon_host.so | Bin 22184 -> 22184 bytes .../bin/src/halide_hexagon_remote.h | 2 +- .../bin/src/halide_hexagon_remote_skel.c | 4 ++-- .../bin/src/halide_hexagon_remote_stub.c | 8 ++++---- .../bin/v60/libhalide_hexagon_remote_skel.so | Bin 32504 -> 32536 bytes .../libhalide_hexagon_remote_skel.so | Bin 37888 -> 37888 bytes .../hexagon_remote/halide_hexagon_remote.idl | 2 +- src/runtime/hexagon_remote/halide_remote.cpp | 19 +++++++++++++++--- src/runtime/hexagon_remote/host_shim.cpp | 18 +++++++++-------- src/runtime/hexagon_remote/pack_buffer.h | 5 +++++ 11 files changed, 39 insertions(+), 19 deletions(-) diff --git a/src/runtime/hexagon_remote/bin/arm-32-android/libhalide_hexagon_host.so b/src/runtime/hexagon_remote/bin/arm-32-android/libhalide_hexagon_host.so index a16be44a6f4ebd4949d1b09d4ae9bf4151091ffa..fc4653f555acc100fb796bf0a705871d5d05cd3e 100755 GIT binary patch delta 872 zcmXYwT}TvB6vxlmU0Ef^ul(4=uZ;XiAw#33f;B42Bn|UHL)aEK-N-LYA)%Nn?1Pn| zGQo&z4-tW@xw|>Syc7r;)SJ~-`XCu>nv`Z?SgbXjnb`}6-}#^Wzvsf`p5=AZ^15lz z9p$V6a1PyWj|p7>&_Y5Cr{KKsH}w$~3lG!6Xq6sV%!nnz<2@ei7fz&ma8p`JKVrlj zAth@TcZ9{PumMVh_t`6G5uWGFVy)1-cN-gop4>)mvlyWEJV21RAg$$k422m*09K02 zl>l1@0Lm!G3e(Ip${Q%(ItSpQd`_C&pO2Y?g#dLVgB4_@7^G0`p#p&W(vQ3kd8hBd zA@o8fnz0#DAq)y!!X&(iGK|0{=z+J8giTn9<>0`Rcoc1zj{w)mQv}DLmUdsjhQL+b zif?tawAin-oDa@PGqyvhlil?5VtPUAQ$`KIsB5W#I?%bMl`tZZE`)DfR>Q_QkKMt?MepZb9W;-t;M zI({iUy*DIm>vb1VZPXXhZk0YGGlli~abnj$g+E2SL98R*jF3f$lB1@G(|&MB8nRbT zVu!dCiymZR4~MqIQToyP;vk8Vkobzj0UQ?VlLr7>8vTE62p+cN31ue|BRv zVvAgnLOx6u7gO;dPRlWAIABavheKP2I2bY0)X3g+ylcT#@o*_-N2#}siuI+qFG?FD JxwjPU#{c8ae8d0% delta 876 zcmXYwZAepL6vxlmt~hC1S~{1ME;G}Vlr)lxv?yw6I%EWrprTeEe4`goDDETpK}m3O zjT?=?u)_B(?_hl}i2P#V2Mx1?nSL{S2I%^3l${_L1)-f8!G6$RCx44j#gNt*HPGlGAp8Y%&*_QXWVFXqSE@e@s5#1U7sK zM*I!e!2;i49qfpB7N0{KOo9X70OD0Vfq8HRk76nwK?~9yRFeiL!AV&k%n7E#dxE=g zCiYfsMNJJ{yHi&QbrrSMP+4D94FJMaxJ7zURD}G~DVg`lGH-Y<^ImT+%T_qNgN;rT z`#84sLFPRd+|2e#<_8QfSk0_bH_W)tns&@<`r@Ld+ld~kYxpAbH)w7bQJFiT(#s}^ z${biy`*`M4onDstRS9@moD8%eqzevu&d1<_O#SUF%mk zkekC^hV+EWewMSU<;RK8!m(vl^ImppO$(G02Tdc)woZi}12g>88mz>jTpertCG+&s zVBOT>4Mb&-E2P^M4(pjQsKw6_Z~v3|0%9YvoOm}x79vU&#XS*1WTZjjN?Y~nCk{xR zW%)x`EzTLyjg4ZH33H>m=u>OQ1iQ!yh;L2UfiAJcjP<&0hxpEnr^RtI8vW5bagoDr z|DWAhgjnUb$50^}#aRnx;GjPu7CZD&%7UmzXNE`Nv^oC1IJ|GgdGS~lCWI;1b%`Ze Pcpyw&C4X}kmg)ZkzG-{z diff --git a/src/runtime/hexagon_remote/bin/arm-64-android/libhalide_hexagon_host.so b/src/runtime/hexagon_remote/bin/arm-64-android/libhalide_hexagon_host.so index bea4a09f2f043991412e63090553c4894894a194..f396dd4bae01d5d4bf7da10d7bd7e24ed5e73c2e 100755 GIT binary patch delta 133 zcmZ3nmT|>e#tj7;u3Zde#tj7;u9XZ5j58Q`7{4*3Gl(&~VtB{k$;im)#JG&1li>nG0OKJBM#gAH zD@F%~Fh(OrO-4ONF-8W41fUvi25W{8pzIcgyOXzSv`+Tcye40qo0yZskXD+P%#fFu eo63-!pOVUe0Fy6ph;4S&x-8F_x>?ezp9cWsSRsZ0 diff --git a/src/runtime/hexagon_remote/bin/src/halide_hexagon_remote.h b/src/runtime/hexagon_remote/bin/src/halide_hexagon_remote.h index 1f77e7a1f500..a12e03ee91b1 100644 --- a/src/runtime/hexagon_remote/bin/src/halide_hexagon_remote.h +++ b/src/runtime/hexagon_remote/bin/src/halide_hexagon_remote.h @@ -37,7 +37,7 @@ __QAIC_HEADER_EXPORT int __QAIC_HEADER(halide_hexagon_remote_initialize_kernels_ __QAIC_HEADER_EXPORT int __QAIC_HEADER(halide_hexagon_remote_get_symbol_v4)(halide_hexagon_remote_handle_t module_ptr, const char* name, int nameLen, halide_hexagon_remote_handle_t* sym_ptr) __QAIC_HEADER_ATTRIBUTE; __QAIC_HEADER_EXPORT int __QAIC_HEADER(halide_hexagon_remote_power_hvx_on)(void) __QAIC_HEADER_ATTRIBUTE; __QAIC_HEADER_EXPORT int __QAIC_HEADER(halide_hexagon_remote_power_hvx_off)(void) __QAIC_HEADER_ATTRIBUTE; -__QAIC_HEADER_EXPORT int __QAIC_HEADER(halide_hexagon_remote_run_v2)(halide_hexagon_remote_handle_t module_ptr, halide_hexagon_remote_handle_t symbol, const halide_hexagon_remote_buffer* input_buffers, int input_buffersLen, halide_hexagon_remote_buffer* output_buffers, int output_buffersLen, int scalar_count, const unsigned char* small, int smallLen) __QAIC_HEADER_ATTRIBUTE; +__QAIC_HEADER_EXPORT int __QAIC_HEADER(halide_hexagon_remote_run_v2)(halide_hexagon_remote_handle_t module_ptr, halide_hexagon_remote_handle_t symbol, const halide_hexagon_remote_buffer* input_buffers, int input_buffersLen, halide_hexagon_remote_buffer* output_buffers, int output_buffersLen, int scalar_count, const unsigned char* small_input_args, int small_input_argsLen) __QAIC_HEADER_ATTRIBUTE; __QAIC_HEADER_EXPORT int __QAIC_HEADER(halide_hexagon_remote_release_kernels_v2)(halide_hexagon_remote_handle_t module_ptr) __QAIC_HEADER_ATTRIBUTE; __QAIC_HEADER_EXPORT int __QAIC_HEADER(halide_hexagon_remote_poll_log)(char* log, int logLen, int* read_size) __QAIC_HEADER_ATTRIBUTE; __QAIC_HEADER_EXPORT int __QAIC_HEADER(halide_hexagon_remote_poll_profiler_state)(int* func, int* threads) __QAIC_HEADER_ATTRIBUTE; diff --git a/src/runtime/hexagon_remote/bin/src/halide_hexagon_remote_skel.c b/src/runtime/hexagon_remote/bin/src/halide_hexagon_remote_skel.c index a5fedf2d6170..073eeb351505 100644 --- a/src/runtime/hexagon_remote/bin/src/halide_hexagon_remote_skel.c +++ b/src/runtime/hexagon_remote/bin/src/halide_hexagon_remote_skel.c @@ -425,8 +425,8 @@ static const Parameter parameters[8] = {{SLIM_IFPTR32(0x8,0x10),{{(const uintptr static const Parameter* const parameterArrays[21] = {(&(parameters[5])),(&(parameters[2])),(&(parameters[2])),(&(parameters[5])),(&(parameters[2])),(&(parameters[2])),(&(parameters[5])),(&(parameters[5])),(&(parameters[2])),(&(parameters[2])),(&(parameters[3])),(&(parameters[4])),(&(parameters[5])),(&(parameters[0])),(&(parameters[2])),(&(parameters[0])),(&(parameters[1])),(&(parameters[7])),(&(parameters[7])),(&(parameters[6])),(&(parameters[7]))}; static const Method methods[9] = {{REMOTE_SCALARS_MAKEX(0,0,0x2,0x1,0x0,0x0),0x4,0x4,3,2,(&(parameterArrays[15])),0x4,0x4},{REMOTE_SCALARS_MAKEX(0,0,0x2,0x1,0x0,0x0),0x8,0x4,4,3,(&(parameterArrays[14])),0x4,0x4},{REMOTE_SCALARS_MAKEX(0,0,0x0,0x0,0x0,0x0),0x0,0x0,0,0,0,0x0,0x0},{REMOTE_SCALARS_MAKEX(0,0,255,255,15,15),0x18,0x0,10,6,(&(parameterArrays[8])),0x4,0x1},{REMOTE_SCALARS_MAKEX(0,0,0x1,0x0,0x0,0x0),0x4,0x0,1,1,(&(parameterArrays[1])),0x4,0x0},{REMOTE_SCALARS_MAKEX(0,0,0x1,0x2,0x0,0x0),0x4,0x4,4,2,(&(parameterArrays[19])),0x4,0x4},{REMOTE_SCALARS_MAKEX(0,0,0x0,0x1,0x0,0x0),0x0,0x8,2,2,(&(parameterArrays[17])),0x1,0x4},{REMOTE_SCALARS_MAKEX(0,0,0x1,0x0,0x0,0x0),0x4,0x0,1,1,(&(parameterArrays[0])),0x4,0x0},{REMOTE_SCALARS_MAKEX(0,0,0x1,0x0,0x0,0x0),0x20,0x0,8,8,(&(parameterArrays[0])),0x4,0x0}}; static const Method* const methodArrays[10] = {&(methods[0]),&(methods[1]),&(methods[2]),&(methods[2]),&(methods[3]),&(methods[4]),&(methods[5]),&(methods[6]),&(methods[7]),&(methods[8])}; -static const char strings[357] = "initialize_kernels_v3\0busbwUsagePercentage\0set_performance_mode\0poll_profiler_state\0release_kernels_v2\0bwMegabytesPerSec\0set_performance\0output_buffers\0mipsPerThread\0input_buffers\0power_hvx_off\0get_symbol_v4\0scalar_count\0power_hvx_on\0set_latency\0set_bus_bw\0module_ptr\0mipsTotal\0read_size\0set_mips\0poll_log\0threads\0sym_ptr\0symbol\0run_v2\0small\0func\0name\0code\0"; -static const uint16_t methodStrings[35] = {121,288,152,268,246,103,22,234,238,329,257,322,166,137,208,336,194,257,347,314,64,342,306,297,302,278,0,352,257,43,59,84,257,180,221}; +static const char strings[368] = "initialize_kernels_v3\0busbwUsagePercentage\0set_performance_mode\0poll_profiler_state\0release_kernels_v2\0bwMegabytesPerSec\0small_input_args\0set_performance\0output_buffers\0mipsPerThread\0input_buffers\0power_hvx_off\0get_symbol_v4\0scalar_count\0power_hvx_on\0set_latency\0set_bus_bw\0module_ptr\0mipsTotal\0read_size\0set_mips\0poll_log\0threads\0sym_ptr\0symbol\0run_v2\0func\0name\0code\0"; +static const uint16_t methodStrings[35] = {138,305,169,285,263,103,22,251,255,346,274,339,183,154,225,121,211,274,358,331,64,353,323,314,319,295,0,363,274,43,59,84,274,197,238}; static const uint16_t methodStringsArrays[10] = {26,16,34,33,9,31,23,20,29,0}; __QAIC_SLIM_EXPORT const Interface __QAIC_SLIM(halide_hexagon_remote_slim) = {10,&(methodArrays[0]),0,0,&(methodStringsArrays [0]),methodStrings,strings}; #endif //_HALIDE_HEXAGON_REMOTE_SLIM_H diff --git a/src/runtime/hexagon_remote/bin/src/halide_hexagon_remote_stub.c b/src/runtime/hexagon_remote/bin/src/halide_hexagon_remote_stub.c index 0cb7d241e728..8b3a975cb8d2 100644 --- a/src/runtime/hexagon_remote/bin/src/halide_hexagon_remote_stub.c +++ b/src/runtime/hexagon_remote/bin/src/halide_hexagon_remote_stub.c @@ -425,8 +425,8 @@ static const Parameter parameters[8] = {{SLIM_IFPTR32(0x8,0x10),{{(const uintptr static const Parameter* const parameterArrays[21] = {(&(parameters[5])),(&(parameters[2])),(&(parameters[2])),(&(parameters[5])),(&(parameters[2])),(&(parameters[2])),(&(parameters[5])),(&(parameters[5])),(&(parameters[2])),(&(parameters[2])),(&(parameters[3])),(&(parameters[4])),(&(parameters[5])),(&(parameters[0])),(&(parameters[2])),(&(parameters[0])),(&(parameters[1])),(&(parameters[7])),(&(parameters[7])),(&(parameters[6])),(&(parameters[7]))}; static const Method methods[9] = {{REMOTE_SCALARS_MAKEX(0,0,0x2,0x1,0x0,0x0),0x4,0x4,3,2,(&(parameterArrays[15])),0x4,0x4},{REMOTE_SCALARS_MAKEX(0,0,0x2,0x1,0x0,0x0),0x8,0x4,4,3,(&(parameterArrays[14])),0x4,0x4},{REMOTE_SCALARS_MAKEX(0,0,0x0,0x0,0x0,0x0),0x0,0x0,0,0,0,0x0,0x0},{REMOTE_SCALARS_MAKEX(0,0,255,255,15,15),0x18,0x0,10,6,(&(parameterArrays[8])),0x4,0x1},{REMOTE_SCALARS_MAKEX(0,0,0x1,0x0,0x0,0x0),0x4,0x0,1,1,(&(parameterArrays[1])),0x4,0x0},{REMOTE_SCALARS_MAKEX(0,0,0x1,0x2,0x0,0x0),0x4,0x4,4,2,(&(parameterArrays[19])),0x4,0x4},{REMOTE_SCALARS_MAKEX(0,0,0x0,0x1,0x0,0x0),0x0,0x8,2,2,(&(parameterArrays[17])),0x1,0x4},{REMOTE_SCALARS_MAKEX(0,0,0x1,0x0,0x0,0x0),0x4,0x0,1,1,(&(parameterArrays[0])),0x4,0x0},{REMOTE_SCALARS_MAKEX(0,0,0x1,0x0,0x0,0x0),0x20,0x0,8,8,(&(parameterArrays[0])),0x4,0x0}}; static const Method* const methodArrays[10] = {&(methods[0]),&(methods[1]),&(methods[2]),&(methods[2]),&(methods[3]),&(methods[4]),&(methods[5]),&(methods[6]),&(methods[7]),&(methods[8])}; -static const char strings[357] = "initialize_kernels_v3\0busbwUsagePercentage\0set_performance_mode\0poll_profiler_state\0release_kernels_v2\0bwMegabytesPerSec\0set_performance\0output_buffers\0mipsPerThread\0input_buffers\0power_hvx_off\0get_symbol_v4\0scalar_count\0power_hvx_on\0set_latency\0set_bus_bw\0module_ptr\0mipsTotal\0read_size\0set_mips\0poll_log\0threads\0sym_ptr\0symbol\0run_v2\0small\0func\0name\0code\0"; -static const uint16_t methodStrings[35] = {121,288,152,268,246,103,22,234,238,329,257,322,166,137,208,336,194,257,347,314,64,342,306,297,302,278,0,352,257,43,59,84,257,180,221}; +static const char strings[368] = "initialize_kernels_v3\0busbwUsagePercentage\0set_performance_mode\0poll_profiler_state\0release_kernels_v2\0bwMegabytesPerSec\0small_input_args\0set_performance\0output_buffers\0mipsPerThread\0input_buffers\0power_hvx_off\0get_symbol_v4\0scalar_count\0power_hvx_on\0set_latency\0set_bus_bw\0module_ptr\0mipsTotal\0read_size\0set_mips\0poll_log\0threads\0sym_ptr\0symbol\0run_v2\0func\0name\0code\0"; +static const uint16_t methodStrings[35] = {138,305,169,285,263,103,22,251,255,346,274,339,183,154,225,121,211,274,358,331,64,353,323,314,319,295,0,363,274,43,59,84,274,197,238}; static const uint16_t methodStringsArrays[10] = {26,16,34,33,9,31,23,20,29,0}; __QAIC_SLIM_EXPORT const Interface __QAIC_SLIM(halide_hexagon_remote_slim) = {10,&(methodArrays[0]),0,0,&(methodStringsArrays [0]),methodStrings,strings}; #endif //_HALIDE_HEXAGON_REMOTE_SLIM_H @@ -714,9 +714,9 @@ static __inline int _stub_method_3(remote_handle _handle, uint32_t _mid, uint32_ _allocator_deinit(_al); return _nErr; } -__QAIC_STUB_EXPORT int __QAIC_STUB(halide_hexagon_remote_run_v2)(halide_hexagon_remote_handle_t module_ptr, halide_hexagon_remote_handle_t symbol, const halide_hexagon_remote_buffer* input_buffers, int input_buffersLen, halide_hexagon_remote_buffer* output_buffers, int output_buffersLen, int scalar_count, const unsigned char* small, int smallLen) __QAIC_STUB_ATTRIBUTE { +__QAIC_STUB_EXPORT int __QAIC_STUB(halide_hexagon_remote_run_v2)(halide_hexagon_remote_handle_t module_ptr, halide_hexagon_remote_handle_t symbol, const halide_hexagon_remote_buffer* input_buffers, int input_buffersLen, halide_hexagon_remote_buffer* output_buffers, int output_buffersLen, int scalar_count, const unsigned char* small_input_args, int small_input_argsLen) __QAIC_STUB_ATTRIBUTE { uint32_t _mid = 4; - return _stub_method_3(_halide_hexagon_remote_handle(), _mid, (uint32_t*)&module_ptr, (uint32_t*)&symbol, (void**)&input_buffers, (uint32_t*)&input_buffersLen, (void**)&output_buffers, (uint32_t*)&output_buffersLen, (uint32_t*)&scalar_count, (char**)&small, (uint32_t*)&smallLen); + return _stub_method_3(_halide_hexagon_remote_handle(), _mid, (uint32_t*)&module_ptr, (uint32_t*)&symbol, (void**)&input_buffers, (uint32_t*)&input_buffersLen, (void**)&output_buffers, (uint32_t*)&output_buffersLen, (uint32_t*)&scalar_count, (char**)&small_input_args, (uint32_t*)&small_input_argsLen); } static __inline int _stub_method_4(remote_handle _handle, uint32_t _mid, uint32_t _in0[1]) { remote_arg _pra[1]; diff --git a/src/runtime/hexagon_remote/bin/v60/libhalide_hexagon_remote_skel.so b/src/runtime/hexagon_remote/bin/v60/libhalide_hexagon_remote_skel.so index 2b3d2a1760094474945ae58830c865b5335c92d3..d4030b6e510d03d8780220baf8d707c5e5828710 100755 GIT binary patch delta 8677 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 LjEWA0RImRAp!+X; delta 9035 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 diff --git a/src/runtime/hexagon_remote/bin/v60/signed_by_debug/libhalide_hexagon_remote_skel.so b/src/runtime/hexagon_remote/bin/v60/signed_by_debug/libhalide_hexagon_remote_skel.so index 0824f3896db5dcf76c10b575be804adb4ccfe7da..24aea14073c2d0acbf29dca3006ebc659ec8014e 100644 GIT binary patch delta 7031 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 Sb_=#uPo%kohQR7J!G8l input_buffers, rout sequence output_buffers, - in long scalar_count, in buffer small); + in long scalar_count, in buffer small_input_args); // Routine to clean up a module on the remote side. long release_kernels_v2(in handle_t module_ptr); diff --git a/src/runtime/hexagon_remote/halide_remote.cpp b/src/runtime/hexagon_remote/halide_remote.cpp index 4e222c66ec45..f2fb293c9c47 100644 --- a/src/runtime/hexagon_remote/halide_remote.cpp +++ b/src/runtime/hexagon_remote/halide_remote.cpp @@ -316,7 +316,8 @@ int halide_hexagon_remote_get_symbol_v4(handle_t module_ptr, const char* name, i int halide_hexagon_remote_run_v2(handle_t module_ptr, handle_t function, const buffer *input_buffersPtrs, int input_buffersLen, buffer *output_buffersPtrs, int output_buffersLen, - int scalar_count, const unsigned char *small, int smallLen) { + int scalar_count, + const unsigned char *small_input_args, int small_input_argsLen) { // Get a pointer to the argv version of the pipeline. pipeline_argv_t pipeline = reinterpret_cast(function); @@ -332,6 +333,8 @@ int halide_hexagon_remote_run_v2(handle_t module_ptr, handle_t function, void **args = (void **)__builtin_alloca((input_buffersLen + scalar_count + output_buffersLen) * sizeof(void *)); buffer_t *buffers = (buffer_t *)__builtin_alloca((input_buffersLen + output_buffersLen) * sizeof(buffer_t)); + const unsigned char *small_input_args_end = small_input_args + small_input_argsLen; + void **next_arg = &args[0]; buffer_t *next_buffer_t = &buffers[0]; // Input buffers come first. @@ -340,7 +343,12 @@ int halide_hexagon_remote_run_v2(handle_t module_ptr, handle_t function, // This buffer is passed directly. next_buffer_t->host = input_buffersPtrs[i].data; } else { - next_buffer_t->host = const_cast(read_buffer(small)); + next_buffer_t->host = const_cast(read_buffer(small_input_args)); + if (small_input_args > small_input_args_end) { + log_printf("Input buffer %d read past the end of small_input_args [%p, %p)\n", + i, small_input_args - small_input_args_end); + return halide_error_code_access_out_of_bounds; + } } *next_arg = next_buffer_t; } @@ -352,7 +360,12 @@ int halide_hexagon_remote_run_v2(handle_t module_ptr, handle_t function, } // Input scalars are last. for (int i = 0; i < scalar_count; i++, next_arg++) { - *next_arg = const_cast(read_buffer(small)); + *next_arg = const_cast(read_buffer(small_input_args)); + if (small_input_args > small_input_args_end) { + log_printf("Input scalar %d read past the end of small_input_args by %d bytes\n", + i, small_input_args - small_input_args_end); + return halide_error_code_access_out_of_bounds; + } } // Prior to running the pipeline, power HVX on (if it was not already on). diff --git a/src/runtime/hexagon_remote/host_shim.cpp b/src/runtime/hexagon_remote/host_shim.cpp index be0e60fb7440..b9133bfa23ca 100644 --- a/src/runtime/hexagon_remote/host_shim.cpp +++ b/src/runtime/hexagon_remote/host_shim.cpp @@ -16,27 +16,29 @@ int halide_hexagon_remote_run(handle_t module_ptr, handle_t function, const int buffer_alignment = 128; const int scalar_alignment = 4; - int small_size = 0; + int small_input_args_size = 0; - // Add up the number and size of the small input buffers. + // Add up the number and size of the small input buffers. Buffers + // are considered small if they are less than + // min_input_buffer_size bytes. const int min_input_buffer_size = 4096; for (int i = 0; i < input_buffersLen; i++) { if (input_buffersPtrs[i].dataLen < min_input_buffer_size) { - small_size += packed_buffer_size(input_buffersPtrs[i].dataLen, buffer_alignment); + small_input_args_size += packed_buffer_size(input_buffersPtrs[i].dataLen, buffer_alignment); } } // Add up the number and size of the scalars. for (int i = 0; i < input_scalarsLen; i++) { - small_size += packed_buffer_size(input_scalarsPtrs[i].dataLen, scalar_alignment); + small_input_args_size += packed_buffer_size(input_scalarsPtrs[i].dataLen, scalar_alignment); } // Allocate a buffer to hold the packed small buffers and scalars. - unsigned char *small = (unsigned char *)__builtin_alloca(small_size + buffer_alignment); - small = (unsigned char *)(((uintptr_t)small + buffer_alignment - 1) & ~(buffer_alignment - 1)); + unsigned char *small_input_args = (unsigned char *)__builtin_alloca(small_input_args_size + buffer_alignment); + small_input_args = (unsigned char *)(((uintptr_t)small_input_args + buffer_alignment - 1) & ~(buffer_alignment - 1)); // Pack up the small buffers. - unsigned char *write = small; + unsigned char *write = small_input_args; for (int i = 0; i < input_buffersLen; i++) { if (input_buffersPtrs[i].dataLen < min_input_buffer_size) { write_buffer(write, input_buffersPtrs[i].data, input_buffersPtrs[i].dataLen, buffer_alignment); @@ -56,7 +58,7 @@ int halide_hexagon_remote_run(handle_t module_ptr, handle_t function, return halide_hexagon_remote_run_v2(module_ptr, function, input_buffersPtrs, input_buffersLen, output_buffersPtrs, output_buffersLen, - input_scalarsLen, small, small_size); + input_scalarsLen, small_input_args, small_input_args_size); } } // extern "C" diff --git a/src/runtime/hexagon_remote/pack_buffer.h b/src/runtime/hexagon_remote/pack_buffer.h index 9eedc3be9235..5b65636c9bdd 100644 --- a/src/runtime/hexagon_remote/pack_buffer.h +++ b/src/runtime/hexagon_remote/pack_buffer.h @@ -3,6 +3,9 @@ #include +// This header implements a simple buffer packing protocol for packing +// and unpacking scalars and buffers into a larger buffer. + template void write_scalar(unsigned char *&write, const T& value) { *(T *)write = value; @@ -34,6 +37,8 @@ inline uint32_t aligned_offset(const unsigned char *start, uint32_t offset, uint return x - (uintptr_t)start; } +// Buffers are stored with two offsets, indicating the start and end +// of the buffer from the start. inline void write_buffer(unsigned char *&write, const unsigned char *buffer, uint32_t size, uint32_t alignment) { unsigned char *start = write; uint32_t header_size = sizeof(uint32_t) * 2; From 2eecff2db14b018a5fdd498795d5c94e5e8ab407 Mon Sep 17 00:00:00 2001 From: dsharletg Date: Thu, 13 Jul 2017 08:59:33 -0700 Subject: [PATCH 6/7] Add comments on the small_input_args protocol. --- .../bin/v60/libhalide_hexagon_remote_skel.so | Bin 32536 -> 32536 bytes .../libhalide_hexagon_remote_skel.so | Bin 37888 -> 37888 bytes .../hexagon_remote/halide_hexagon_remote.idl | 9 ++++++--- src/runtime/hexagon_remote/halide_remote.cpp | 1 + src/runtime/hexagon_remote/pack_buffer.h | 7 ++++++- 5 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/runtime/hexagon_remote/bin/v60/libhalide_hexagon_remote_skel.so b/src/runtime/hexagon_remote/bin/v60/libhalide_hexagon_remote_skel.so index d4030b6e510d03d8780220baf8d707c5e5828710..102416c183453676703ae0de058e071f45bf57e2 100755 GIT binary patch delta 4345 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 delta 4373 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 diff --git a/src/runtime/hexagon_remote/halide_hexagon_remote.idl b/src/runtime/hexagon_remote/halide_hexagon_remote.idl index eb47ca9ff1b2..1a95a94d7ed7 100644 --- a/src/runtime/hexagon_remote/halide_hexagon_remote.idl +++ b/src/runtime/hexagon_remote/halide_hexagon_remote.idl @@ -17,9 +17,12 @@ interface halide_hexagon_remote long power_hvx_off(); // Routine to run a pipeline on the remote side. - // v2: Pass all scalars and small input buffers in a single - // buffer. The null input buffers are passed in the small buffer - // instead, followed by scalar_count scalars. + // v2: Pass all scalars and small input buffers in a + // small_input_args buffer. The small_input_args buffer is packed + // using the protocol in pack_buffer.h. It contains the input + // buffers first, followed by the scalars. An input buffer is + // passed in the small_input_args buffer if the input buffer is + // null. long run_v2(in handle_t module_ptr, in handle_t symbol, in sequence input_buffers, rout sequence output_buffers, diff --git a/src/runtime/hexagon_remote/halide_remote.cpp b/src/runtime/hexagon_remote/halide_remote.cpp index f2fb293c9c47..ce256877286f 100644 --- a/src/runtime/hexagon_remote/halide_remote.cpp +++ b/src/runtime/hexagon_remote/halide_remote.cpp @@ -343,6 +343,7 @@ int halide_hexagon_remote_run_v2(handle_t module_ptr, handle_t function, // This buffer is passed directly. next_buffer_t->host = input_buffersPtrs[i].data; } else { + // This input buffer was passed in the small_input_args buffer. next_buffer_t->host = const_cast(read_buffer(small_input_args)); if (small_input_args > small_input_args_end) { log_printf("Input buffer %d read past the end of small_input_args [%p, %p)\n", diff --git a/src/runtime/hexagon_remote/pack_buffer.h b/src/runtime/hexagon_remote/pack_buffer.h index 5b65636c9bdd..b237dfeb2a4a 100644 --- a/src/runtime/hexagon_remote/pack_buffer.h +++ b/src/runtime/hexagon_remote/pack_buffer.h @@ -55,7 +55,12 @@ inline const unsigned char *read_buffer(const unsigned char *&read) { uint32_t offset_start = read_scalar(read); uint32_t offset_end = read_scalar(read); read = start + offset_end; - return start + offset_start; + if (offset_end > offset_start) { + return start + offset_start; + } else { + // This was an empty buffer. + return NULL; + } } #endif From 8b7a061d016ae84db8ff5668264a7e88eb148fe5 Mon Sep 17 00:00:00 2001 From: dsharletg Date: Thu, 13 Jul 2017 23:06:49 -0700 Subject: [PATCH 7/7] Only pass scalars in a single buffer. --- .../arm-32-android/libhalide_hexagon_host.so | Bin 79584 -> 79600 bytes .../arm-64-android/libhalide_hexagon_host.so | Bin 22184 -> 22208 bytes .../bin/src/halide_hexagon_remote.h | 4 +- .../bin/src/halide_hexagon_remote_skel.c | 34 +++++---- .../bin/src/halide_hexagon_remote_stub.c | 31 ++++---- .../bin/v60/libhalide_hexagon_remote_skel.so | Bin 32536 -> 32504 bytes .../libhalide_hexagon_remote_skel.so | Bin 37888 -> 37912 bytes .../hexagon_remote/halide_hexagon_remote.idl | 12 ++-- src/runtime/hexagon_remote/halide_remote.cpp | 32 ++------- src/runtime/hexagon_remote/host_shim.cpp | 50 +++---------- src/runtime/hexagon_remote/pack_buffer.h | 66 ------------------ 11 files changed, 56 insertions(+), 173 deletions(-) delete mode 100644 src/runtime/hexagon_remote/pack_buffer.h diff --git a/src/runtime/hexagon_remote/bin/arm-32-android/libhalide_hexagon_host.so b/src/runtime/hexagon_remote/bin/arm-32-android/libhalide_hexagon_host.so index fc4653f555acc100fb796bf0a705871d5d05cd3e..dc83b23b670a86ead3cccb8480574cf7f60b9885 100755 GIT binary patch delta 12443 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 WJ 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ℜe>L>m>B!A*a zn|)>IhM9htq2jDCGi)9?WV2T)Rko~|j#)xJHp$Q5k>5>9Cke2M0&E7^># z0X+kH7SW2_PVbSh*}Ja~(`)!JEX0!qci$j$H!6e5>V50tLFA7?zH7^6!sI*nPPuvV zG`>SVGdY)UlkZKQ8nsc$7#b{--%QS(a4(SA-3~K5!_@9(UsL#QS?DU_b7j3Nmrs+g zx^CvV@}FI)6C9+AKBD%Xg)}u-vi!zn=XN<^%2dBa<3)kGoh^7o+rzd{S~$;oBs>

    *fi?KYUd5O9EO{B|_zFLZYMEVpW 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 delta 3955 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 WbNU= 24); + _ASSERT(_nErr, _pra[0].buf.nLen >= 20); _primIn = _pra[0].buf.pv; _praIn = (_pra + 1); _praROut = (_praIn + _numIn[0] + 0); @@ -621,11 +620,10 @@ static __inline int _skel_method_4(int (*_pfn)(uint32_t, uint32_t, void*, uint32 { _TRY(_nErr, _skel_unpack(_al, (_praIn + 2), _ppraIn, (_praROut + 0), _ppraROut, _seq_primIn3, 0, SLIM_IFPTR32((char**)&(((uint32_t*)_seq_nat3)[0]), (char**)&(((uint64_t*)_seq_nat3)[0])), SLIM_IFPTR32((uint32_t*)&(((uint32_t*)_seq_nat3)[1]), (uint32_t*)&(((uint32_t*)_seq_nat3)[2])))); } - _COPY(_in4, 0, _primIn, 16, 4); - _COPY(_in5Len, 0, _primIn, 20, 4); - _ASSERT(_nErr, (int)((_praIn[2].buf.nLen / 1)) >= (int)(_in5Len[0])); - _in5[0] = _praIn[2].buf.pv; - _TRY(_nErr, _pfn(*_in0, *_in1, *_in2, *_in2Len, *_rout3, *_rout3Len, *_in4, *_in5, *_in5Len)); + _COPY(_in4Len, 0, _primIn, 16, 4); + _ASSERT(_nErr, (int)((_praIn[2].buf.nLen / 8)) >= (int)(_in4Len[0])); + _in4[0] = _praIn[2].buf.pv; + _TRY(_nErr, _pfn(*_in0, *_in1, *_in2, *_in2Len, *_rout3, *_rout3Len, *_in4, *_in4Len)); for(_ii = 0, _seq_nat2 = (char*)_in2[0];_ii < (int)_in2Len[0];++_ii, _seq_nat2 = (_seq_nat2 + SLIM_IFPTR32(8, 16))) { _TRY(_nErr, _skel_pack_1((_praROutPost + 0), _ppraROutPost, 0, SLIM_IFPTR32((char**)&(((uint32_t*)_seq_nat2)[0]), (char**)&(((uint64_t*)_seq_nat2)[0])), SLIM_IFPTR32((uint32_t*)&(((uint32_t*)_seq_nat2)[1]), (uint32_t*)&(((uint32_t*)_seq_nat2)[2])))); diff --git a/src/runtime/hexagon_remote/bin/src/halide_hexagon_remote_stub.c b/src/runtime/hexagon_remote/bin/src/halide_hexagon_remote_stub.c index 8b3a975cb8d2..78292ddfa388 100644 --- a/src/runtime/hexagon_remote/bin/src/halide_hexagon_remote_stub.c +++ b/src/runtime/hexagon_remote/bin/src/halide_hexagon_remote_stub.c @@ -418,16 +418,16 @@ struct Interface { #define __QAIC_SLIM_EXPORT #endif -static const Type types[2]; +static const Type types[3]; static const SequenceType sequenceTypes[1] = {{&(types[1]),0x0,0x4,0x4,0x0}}; -static const Type types[2] = {{0x1,{{(const uintptr_t)0,(const uintptr_t)0}}, 2,0x1},{SLIM_IFPTR32(0x8,0x10),{{(const uintptr_t)&(types[0]),(const uintptr_t)0x0}}, 9,SLIM_IFPTR32(0x4,0x8)}}; -static const Parameter parameters[8] = {{SLIM_IFPTR32(0x8,0x10),{{(const uintptr_t)&(types[0]),(const uintptr_t)0x0}}, 9,SLIM_IFPTR32(0x4,0x8),0,0},{0x4,{{(const uintptr_t)0,(const uintptr_t)0}}, 2,0x4,3,0},{0x4,{{(const uintptr_t)0,(const uintptr_t)0}}, 2,0x4,0,0},{SLIM_IFPTR32(0x8,0x10),{{(const uintptr_t)&(sequenceTypes[0]),0}}, 25,SLIM_IFPTR32(0x4,0x8),0,0},{SLIM_IFPTR32(0x8,0x10),{{(const uintptr_t)&(sequenceTypes[0]),0}}, 25,SLIM_IFPTR32(0x4,0x8),3,0},{0x4,{{(const uintptr_t)0,(const uintptr_t)1}}, 2,0x4,0,0},{SLIM_IFPTR32(0x8,0x10),{{(const uintptr_t)&(types[0]),(const uintptr_t)0x0}}, 9,SLIM_IFPTR32(0x4,0x8),3,0},{0x4,{{(const uintptr_t)0,(const uintptr_t)1}}, 2,0x4,3,0}}; -static const Parameter* const parameterArrays[21] = {(&(parameters[5])),(&(parameters[2])),(&(parameters[2])),(&(parameters[5])),(&(parameters[2])),(&(parameters[2])),(&(parameters[5])),(&(parameters[5])),(&(parameters[2])),(&(parameters[2])),(&(parameters[3])),(&(parameters[4])),(&(parameters[5])),(&(parameters[0])),(&(parameters[2])),(&(parameters[0])),(&(parameters[1])),(&(parameters[7])),(&(parameters[7])),(&(parameters[6])),(&(parameters[7]))}; -static const Method methods[9] = {{REMOTE_SCALARS_MAKEX(0,0,0x2,0x1,0x0,0x0),0x4,0x4,3,2,(&(parameterArrays[15])),0x4,0x4},{REMOTE_SCALARS_MAKEX(0,0,0x2,0x1,0x0,0x0),0x8,0x4,4,3,(&(parameterArrays[14])),0x4,0x4},{REMOTE_SCALARS_MAKEX(0,0,0x0,0x0,0x0,0x0),0x0,0x0,0,0,0,0x0,0x0},{REMOTE_SCALARS_MAKEX(0,0,255,255,15,15),0x18,0x0,10,6,(&(parameterArrays[8])),0x4,0x1},{REMOTE_SCALARS_MAKEX(0,0,0x1,0x0,0x0,0x0),0x4,0x0,1,1,(&(parameterArrays[1])),0x4,0x0},{REMOTE_SCALARS_MAKEX(0,0,0x1,0x2,0x0,0x0),0x4,0x4,4,2,(&(parameterArrays[19])),0x4,0x4},{REMOTE_SCALARS_MAKEX(0,0,0x0,0x1,0x0,0x0),0x0,0x8,2,2,(&(parameterArrays[17])),0x1,0x4},{REMOTE_SCALARS_MAKEX(0,0,0x1,0x0,0x0,0x0),0x4,0x0,1,1,(&(parameterArrays[0])),0x4,0x0},{REMOTE_SCALARS_MAKEX(0,0,0x1,0x0,0x0,0x0),0x20,0x0,8,8,(&(parameterArrays[0])),0x4,0x0}}; +static const Type types[3] = {{0x1,{{(const uintptr_t)0,(const uintptr_t)0}}, 2,0x1},{SLIM_IFPTR32(0x8,0x10),{{(const uintptr_t)&(types[0]),(const uintptr_t)0x0}}, 9,SLIM_IFPTR32(0x4,0x8)},{0x8,{{(const uintptr_t)0,(const uintptr_t)0}}, 2,0x8}}; +static const Parameter parameters[9] = {{SLIM_IFPTR32(0x8,0x10),{{(const uintptr_t)&(types[0]),(const uintptr_t)0x0}}, 9,SLIM_IFPTR32(0x4,0x8),0,0},{0x4,{{(const uintptr_t)0,(const uintptr_t)0}}, 2,0x4,3,0},{0x4,{{(const uintptr_t)0,(const uintptr_t)0}}, 2,0x4,0,0},{SLIM_IFPTR32(0x8,0x10),{{(const uintptr_t)&(sequenceTypes[0]),0}}, 25,SLIM_IFPTR32(0x4,0x8),0,0},{SLIM_IFPTR32(0x8,0x10),{{(const uintptr_t)&(sequenceTypes[0]),0}}, 25,SLIM_IFPTR32(0x4,0x8),3,0},{SLIM_IFPTR32(0x8,0x10),{{(const uintptr_t)&(types[2]),(const uintptr_t)0x0}}, 9,SLIM_IFPTR32(0x4,0x8),0,0},{SLIM_IFPTR32(0x8,0x10),{{(const uintptr_t)&(types[0]),(const uintptr_t)0x0}}, 9,SLIM_IFPTR32(0x4,0x8),3,0},{0x4,{{(const uintptr_t)0,(const uintptr_t)1}}, 2,0x4,3,0},{0x4,{{(const uintptr_t)0,(const uintptr_t)1}}, 2,0x4,0,0}}; +static const Parameter* const parameterArrays[20] = {(&(parameters[8])),(&(parameters[2])),(&(parameters[2])),(&(parameters[8])),(&(parameters[2])),(&(parameters[2])),(&(parameters[8])),(&(parameters[8])),(&(parameters[2])),(&(parameters[2])),(&(parameters[3])),(&(parameters[4])),(&(parameters[5])),(&(parameters[2])),(&(parameters[0])),(&(parameters[1])),(&(parameters[7])),(&(parameters[7])),(&(parameters[6])),(&(parameters[7]))}; +static const Method methods[9] = {{REMOTE_SCALARS_MAKEX(0,0,0x2,0x1,0x0,0x0),0x4,0x4,3,2,(&(parameterArrays[14])),0x4,0x4},{REMOTE_SCALARS_MAKEX(0,0,0x2,0x1,0x0,0x0),0x8,0x4,4,3,(&(parameterArrays[13])),0x4,0x4},{REMOTE_SCALARS_MAKEX(0,0,0x0,0x0,0x0,0x0),0x0,0x0,0,0,0,0x0,0x0},{REMOTE_SCALARS_MAKEX(0,0,255,255,15,15),0x14,0x0,9,5,(&(parameterArrays[8])),0x4,0x1},{REMOTE_SCALARS_MAKEX(0,0,0x1,0x0,0x0,0x0),0x4,0x0,1,1,(&(parameterArrays[1])),0x4,0x0},{REMOTE_SCALARS_MAKEX(0,0,0x1,0x2,0x0,0x0),0x4,0x4,4,2,(&(parameterArrays[18])),0x4,0x4},{REMOTE_SCALARS_MAKEX(0,0,0x0,0x1,0x0,0x0),0x0,0x8,2,2,(&(parameterArrays[16])),0x1,0x4},{REMOTE_SCALARS_MAKEX(0,0,0x1,0x0,0x0,0x0),0x4,0x0,1,1,(&(parameterArrays[0])),0x4,0x0},{REMOTE_SCALARS_MAKEX(0,0,0x1,0x0,0x0,0x0),0x20,0x0,8,8,(&(parameterArrays[0])),0x4,0x0}}; static const Method* const methodArrays[10] = {&(methods[0]),&(methods[1]),&(methods[2]),&(methods[2]),&(methods[3]),&(methods[4]),&(methods[5]),&(methods[6]),&(methods[7]),&(methods[8])}; -static const char strings[368] = "initialize_kernels_v3\0busbwUsagePercentage\0set_performance_mode\0poll_profiler_state\0release_kernels_v2\0bwMegabytesPerSec\0small_input_args\0set_performance\0output_buffers\0mipsPerThread\0input_buffers\0power_hvx_off\0get_symbol_v4\0scalar_count\0power_hvx_on\0set_latency\0set_bus_bw\0module_ptr\0mipsTotal\0read_size\0set_mips\0poll_log\0threads\0sym_ptr\0symbol\0run_v2\0func\0name\0code\0"; -static const uint16_t methodStrings[35] = {138,305,169,285,263,103,22,251,255,346,274,339,183,154,225,121,211,274,358,331,64,353,323,314,319,295,0,363,274,43,59,84,274,197,238}; -static const uint16_t methodStringsArrays[10] = {26,16,34,33,9,31,23,20,29,0}; +static const char strings[346] = "initialize_kernels_v3\0busbwUsagePercentage\0set_performance_mode\0poll_profiler_state\0release_kernels_v2\0bwMegabytesPerSec\0set_performance\0output_buffers\0mipsPerThread\0input_buffers\0power_hvx_off\0get_symbol_v4\0power_hvx_on\0set_latency\0set_bus_bw\0module_ptr\0mipsTotal\0read_size\0set_mips\0poll_log\0threads\0scalars\0sym_ptr\0symbol\0run_v2\0func\0name\0code\0"; +static const uint16_t methodStrings[34] = {121,275,152,255,233,103,22,221,225,324,244,317,166,137,301,194,244,336,309,64,331,293,284,289,265,0,341,244,43,59,84,244,180,208}; +static const uint16_t methodStringsArrays[10] = {25,15,33,32,9,30,22,19,28,0}; __QAIC_SLIM_EXPORT const Interface __QAIC_SLIM(halide_hexagon_remote_slim) = {10,&(methodArrays[0]),0,0,&(methodStringsArrays [0]),methodStrings,strings}; #endif //_HALIDE_HEXAGON_REMOTE_SLIM_H #ifdef __cplusplus @@ -646,7 +646,7 @@ static __inline void _count_1(int _numIn[1], int _numROut[1], char* _in0[1], uin _numIn[0] += 1; _numROut[0] += 0; } -static __inline int _stub_method_3(remote_handle _handle, uint32_t _mid, uint32_t _in0[1], uint32_t _in1[1], void* _in2[1], uint32_t _in2Len[1], void* _rout3[1], uint32_t _rout3Len[1], uint32_t _in4[1], char* _in5[1], uint32_t _in5Len[1]) { +static __inline int _stub_method_3(remote_handle _handle, uint32_t _mid, uint32_t _in0[1], uint32_t _in1[1], void* _in2[1], uint32_t _in2Len[1], void* _rout3[1], uint32_t _rout3Len[1], char* _in4[1], uint32_t _in4Len[1]) { remote_arg* _pra; int _numIn[1]; int _numROut[1]; @@ -654,7 +654,7 @@ static __inline int _stub_method_3(remote_handle _handle, uint32_t _mid, uint32_ int _ii; char* _seq_nat3; _allocator _al[1] = {{0}}; - uint32_t _primIn[6]; + uint32_t _primIn[5]; remote_arg* _praIn; remote_arg* _praROut; remote_arg* _praROutPost; @@ -697,10 +697,9 @@ static __inline int _stub_method_3(remote_handle _handle, uint32_t _mid, uint32_ { _TRY(_nErr, _stub_pack(_al, (_praIn + 2), _ppraIn, (_praROut + 0), _ppraROut, _seq_primIn3, 0, SLIM_IFPTR32((char**)&(((uint32_t*)_seq_nat3)[0]), (char**)&(((uint64_t*)_seq_nat3)[0])), SLIM_IFPTR32((uint32_t*)&(((uint32_t*)_seq_nat3)[1]), (uint32_t*)&(((uint32_t*)_seq_nat3)[2])))); } - _COPY(_primIn, 16, _in4, 0, 4); - _COPY(_primIn, 20, _in5Len, 0, 4); - _praIn[2].buf.pv = _in5[0]; - _praIn[2].buf.nLen = (1 * _in5Len[0]); + _COPY(_primIn, 16, _in4Len, 0, 4); + _praIn[2].buf.pv = _in4[0]; + _praIn[2].buf.nLen = (8 * _in4Len[0]); _TRY(_nErr, __QAIC_REMOTE(remote_handle_invoke)(_handle, REMOTE_SCALARS_MAKEX(0, _mid, (_numIn[0] + 1), (_numROut[0] + 0), 0, 0), _pra)); for(_ii = 0, _seq_nat2 = (char*)_in2[0];_ii < (int)_in2Len[0];++_ii, _seq_nat2 = (_seq_nat2 + SLIM_IFPTR32(8, 16))) { @@ -714,9 +713,9 @@ static __inline int _stub_method_3(remote_handle _handle, uint32_t _mid, uint32_ _allocator_deinit(_al); return _nErr; } -__QAIC_STUB_EXPORT int __QAIC_STUB(halide_hexagon_remote_run_v2)(halide_hexagon_remote_handle_t module_ptr, halide_hexagon_remote_handle_t symbol, const halide_hexagon_remote_buffer* input_buffers, int input_buffersLen, halide_hexagon_remote_buffer* output_buffers, int output_buffersLen, int scalar_count, const unsigned char* small_input_args, int small_input_argsLen) __QAIC_STUB_ATTRIBUTE { +__QAIC_STUB_EXPORT int __QAIC_STUB(halide_hexagon_remote_run_v2)(halide_hexagon_remote_handle_t module_ptr, halide_hexagon_remote_handle_t symbol, const halide_hexagon_remote_buffer* input_buffers, int input_buffersLen, halide_hexagon_remote_buffer* output_buffers, int output_buffersLen, const halide_hexagon_remote_scalar_t* scalars, int scalarsLen) __QAIC_STUB_ATTRIBUTE { uint32_t _mid = 4; - return _stub_method_3(_halide_hexagon_remote_handle(), _mid, (uint32_t*)&module_ptr, (uint32_t*)&symbol, (void**)&input_buffers, (uint32_t*)&input_buffersLen, (void**)&output_buffers, (uint32_t*)&output_buffersLen, (uint32_t*)&scalar_count, (char**)&small_input_args, (uint32_t*)&small_input_argsLen); + return _stub_method_3(_halide_hexagon_remote_handle(), _mid, (uint32_t*)&module_ptr, (uint32_t*)&symbol, (void**)&input_buffers, (uint32_t*)&input_buffersLen, (void**)&output_buffers, (uint32_t*)&output_buffersLen, (char**)&scalars, (uint32_t*)&scalarsLen); } static __inline int _stub_method_4(remote_handle _handle, uint32_t _mid, uint32_t _in0[1]) { remote_arg _pra[1]; diff --git a/src/runtime/hexagon_remote/bin/v60/libhalide_hexagon_remote_skel.so b/src/runtime/hexagon_remote/bin/v60/libhalide_hexagon_remote_skel.so index 102416c183453676703ae0de058e071f45bf57e2..d60c45cbd11b1ed99085bb455bb3d110b9ba28fc 100755 GIT binary patch delta 10008 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 YIM_)j5z!6^@54RaI&0Aqd=?M-H<4G9;s5{u delta 8257 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 DF`IFl diff --git a/src/runtime/hexagon_remote/halide_hexagon_remote.idl b/src/runtime/hexagon_remote/halide_hexagon_remote.idl index 1a95a94d7ed7..d4d02abdcd21 100644 --- a/src/runtime/hexagon_remote/halide_hexagon_remote.idl +++ b/src/runtime/hexagon_remote/halide_hexagon_remote.idl @@ -1,7 +1,10 @@ +#include "AEEStdDef.idl" + interface halide_hexagon_remote { typedef sequence buffer; typedef unsigned long handle_t; + typedef unsigned long long scalar_t; // Routine to initialize a module on the remote side. Returns a pointer to the module. long initialize_kernels_v3(in buffer code, rout handle_t module_ptr); @@ -17,16 +20,11 @@ interface halide_hexagon_remote long power_hvx_off(); // Routine to run a pipeline on the remote side. - // v2: Pass all scalars and small input buffers in a - // small_input_args buffer. The small_input_args buffer is packed - // using the protocol in pack_buffer.h. It contains the input - // buffers first, followed by the scalars. An input buffer is - // passed in the small_input_args buffer if the input buffer is - // null. + // v2: Pass all scalars in a single buffer as an array of scalar_t. long run_v2(in handle_t module_ptr, in handle_t symbol, in sequence input_buffers, rout sequence output_buffers, - in long scalar_count, in buffer small_input_args); + in sequence scalars); // Routine to clean up a module on the remote side. long release_kernels_v2(in handle_t module_ptr); diff --git a/src/runtime/hexagon_remote/halide_remote.cpp b/src/runtime/hexagon_remote/halide_remote.cpp index ce256877286f..38d2f11e37b0 100644 --- a/src/runtime/hexagon_remote/halide_remote.cpp +++ b/src/runtime/hexagon_remote/halide_remote.cpp @@ -15,13 +15,13 @@ extern "C" { #include "dlib.h" #include "pipeline_context.h" #include "log.h" -#include "pack_buffer.h" const int stack_alignment = 128; const int stack_size = 1024 * 1024; typedef halide_hexagon_remote_handle_t handle_t; typedef halide_hexagon_remote_buffer buffer; +typedef halide_hexagon_remote_scalar_t scalar_t; extern "C" { @@ -316,8 +316,7 @@ int halide_hexagon_remote_get_symbol_v4(handle_t module_ptr, const char* name, i int halide_hexagon_remote_run_v2(handle_t module_ptr, handle_t function, const buffer *input_buffersPtrs, int input_buffersLen, buffer *output_buffersPtrs, int output_buffersLen, - int scalar_count, - const unsigned char *small_input_args, int small_input_argsLen) { + const scalar_t *scalars, int scalarsLen) { // Get a pointer to the argv version of the pipeline. pipeline_argv_t pipeline = reinterpret_cast(function); @@ -330,43 +329,24 @@ int halide_hexagon_remote_run_v2(handle_t module_ptr, handle_t function, uint64_t dev; uint8_t* host; }; - void **args = (void **)__builtin_alloca((input_buffersLen + scalar_count + output_buffersLen) * sizeof(void *)); + void **args = (void **)__builtin_alloca((input_buffersLen + scalarsLen + output_buffersLen) * sizeof(void *)); buffer_t *buffers = (buffer_t *)__builtin_alloca((input_buffersLen + output_buffersLen) * sizeof(buffer_t)); - const unsigned char *small_input_args_end = small_input_args + small_input_argsLen; - void **next_arg = &args[0]; buffer_t *next_buffer_t = &buffers[0]; // Input buffers come first. for (int i = 0; i < input_buffersLen; i++, next_arg++, next_buffer_t++) { - if (input_buffersPtrs[i].data) { - // This buffer is passed directly. - next_buffer_t->host = input_buffersPtrs[i].data; - } else { - // This input buffer was passed in the small_input_args buffer. - next_buffer_t->host = const_cast(read_buffer(small_input_args)); - if (small_input_args > small_input_args_end) { - log_printf("Input buffer %d read past the end of small_input_args [%p, %p)\n", - i, small_input_args - small_input_args_end); - return halide_error_code_access_out_of_bounds; - } - } + next_buffer_t->host = input_buffersPtrs[i].data; *next_arg = next_buffer_t; } - // Output buffers are next. for (int i = 0; i < output_buffersLen; i++, next_arg++, next_buffer_t++) { next_buffer_t->host = output_buffersPtrs[i].data; *next_arg = next_buffer_t; } // Input scalars are last. - for (int i = 0; i < scalar_count; i++, next_arg++) { - *next_arg = const_cast(read_buffer(small_input_args)); - if (small_input_args > small_input_args_end) { - log_printf("Input scalar %d read past the end of small_input_args by %d bytes\n", - i, small_input_args - small_input_args_end); - return halide_error_code_access_out_of_bounds; - } + for (int i = 0; i < scalarsLen; i++, next_arg++) { + *next_arg = const_cast(&scalars[i]); } // Prior to running the pipeline, power HVX on (if it was not already on). diff --git a/src/runtime/hexagon_remote/host_shim.cpp b/src/runtime/hexagon_remote/host_shim.cpp index b9133bfa23ca..8e1a0ab6b114 100644 --- a/src/runtime/hexagon_remote/host_shim.cpp +++ b/src/runtime/hexagon_remote/host_shim.cpp @@ -1,10 +1,11 @@ #include +#include #include "bin/src/halide_hexagon_remote.h" -#include "pack_buffer.h" typedef halide_hexagon_remote_handle_t handle_t; typedef halide_hexagon_remote_buffer buffer; +typedef halide_hexagon_remote_scalar_t scalar_t; extern "C" { @@ -13,52 +14,23 @@ int halide_hexagon_remote_run(handle_t module_ptr, handle_t function, buffer *input_buffersPtrs, int input_buffersLen, buffer *output_buffersPtrs, int output_buffersLen, const buffer *input_scalarsPtrs, int input_scalarsLen) { - const int buffer_alignment = 128; - const int scalar_alignment = 4; - - int small_input_args_size = 0; - - // Add up the number and size of the small input buffers. Buffers - // are considered small if they are less than - // min_input_buffer_size bytes. - const int min_input_buffer_size = 4096; - for (int i = 0; i < input_buffersLen; i++) { - if (input_buffersPtrs[i].dataLen < min_input_buffer_size) { - small_input_args_size += packed_buffer_size(input_buffersPtrs[i].dataLen, buffer_alignment); - } - } - - // Add up the number and size of the scalars. + // Pack all of the scalars into an array of scalar_t. + scalar_t *scalars = (scalar_t *)__builtin_alloca(input_scalarsLen * sizeof(scalar_t)); for (int i = 0; i < input_scalarsLen; i++) { - small_input_args_size += packed_buffer_size(input_scalarsPtrs[i].dataLen, scalar_alignment); - } - - // Allocate a buffer to hold the packed small buffers and scalars. - unsigned char *small_input_args = (unsigned char *)__builtin_alloca(small_input_args_size + buffer_alignment); - small_input_args = (unsigned char *)(((uintptr_t)small_input_args + buffer_alignment - 1) & ~(buffer_alignment - 1)); - - // Pack up the small buffers. - unsigned char *write = small_input_args; - for (int i = 0; i < input_buffersLen; i++) { - if (input_buffersPtrs[i].dataLen < min_input_buffer_size) { - write_buffer(write, input_buffersPtrs[i].data, input_buffersPtrs[i].dataLen, buffer_alignment); - - // Remove the buffer from the actual buffers list. - input_buffersPtrs[i].data = NULL; - input_buffersPtrs[i].dataLen = 0; + int scalar_size = input_scalarsPtrs[i].dataLen; + if (scalar_size > sizeof(scalar_t)) { + __android_log_print(ANDROID_LOG_ERROR, "halide", "Scalar argument %d is larger than %d bytes (%d bytes)", + i, sizeof(scalar_t), scalar_size); + return -1; } - } - - // Pack up the scalars. - for (int i = 0; i < input_scalarsLen; i++) { - write_buffer(write, input_scalarsPtrs[i].data, input_scalarsPtrs[i].dataLen, scalar_alignment); + memcpy(&scalars[i], input_scalarsPtrs[i].data, scalar_size); } // Call v2 with the adapted arguments. return halide_hexagon_remote_run_v2(module_ptr, function, input_buffersPtrs, input_buffersLen, output_buffersPtrs, output_buffersLen, - input_scalarsLen, small_input_args, small_input_args_size); + scalars, input_scalarsLen); } } // extern "C" diff --git a/src/runtime/hexagon_remote/pack_buffer.h b/src/runtime/hexagon_remote/pack_buffer.h deleted file mode 100644 index b237dfeb2a4a..000000000000 --- a/src/runtime/hexagon_remote/pack_buffer.h +++ /dev/null @@ -1,66 +0,0 @@ -#ifndef HALIDE_HEXAGON_REMOTE_BUFFER_PACKING_H -#define HALIDE_HEXAGON_REMOTE_BUFFER_PACKING_H - -#include - -// This header implements a simple buffer packing protocol for packing -// and unpacking scalars and buffers into a larger buffer. - -template -void write_scalar(unsigned char *&write, const T& value) { - *(T *)write = value; - write += sizeof(T); -} - -template -T read_scalar(const unsigned char *&read) { - T value = *(T *)read; - read += sizeof(T); - return value; -} - -inline uint32_t packed_buffer_size(uint32_t size, uint32_t alignment) { - // We write the start and end offsets. - size += sizeof(uint32_t) * 2; - // We also need room for the padding. - size += alignment * 2; - - return size; -} - -// Given a pointer, compute an offset to add that is at least offset -// to ensure that start + aligned_offset(start, offset, alignment) is -// aligned to alignment. -inline uint32_t aligned_offset(const unsigned char *start, uint32_t offset, uint32_t alignment) { - uintptr_t x = (uintptr_t)start; - x = (x + offset + alignment - 1) & ~(alignment - 1); - return x - (uintptr_t)start; -} - -// Buffers are stored with two offsets, indicating the start and end -// of the buffer from the start. -inline void write_buffer(unsigned char *&write, const unsigned char *buffer, uint32_t size, uint32_t alignment) { - unsigned char *start = write; - uint32_t header_size = sizeof(uint32_t) * 2; - uint32_t offset_start = aligned_offset(start, header_size, alignment); - uint32_t offset_end = aligned_offset(start, offset_start + size, alignment); - write_scalar(write, offset_start); - write_scalar(write, offset_end); - memcpy(start + offset_start, buffer, size); - write = start + offset_end; -} - -inline const unsigned char *read_buffer(const unsigned char *&read) { - const unsigned char *start = read; - uint32_t offset_start = read_scalar(read); - uint32_t offset_end = read_scalar(read); - read = start + offset_end; - if (offset_end > offset_start) { - return start + offset_start; - } else { - // This was an empty buffer. - return NULL; - } -} - -#endif